多线程

/*

 * 线程:

 *

 * 线程的好处:解决了在一个进程中同时可以执行多个任务代码的问题。

 *

 * 自定义线程创建方式:

 *        方式一:继承Thread.

 *                1.自定义一个类继承Thread类。

 *                2.重写Threadrun方法。把自定义线程的任务代码自定义run方法上。

 *                3.创建Thread 子类的对象,并且Start方法启动一个线程。

 public class demo1 extends Thread{

 

publicdemo1(String name){

super(name);

}

@Override

publicvoid run(){

 

for(inti=0;i<100;i++){

//Thread.currentThread() 得到的就是当前thread对象

System.out.println(Thread.currentThread().getName()+":"+i);

}

}

 

publicstatic void main(String[] args){

 

demo1 d=new demo1("狗娃");

//开启一个线程

d.start();

for(inti=0;i<100;i++){

//Thread.currentThread() 得到的就是当前thread对象

System.out.println(Thread.currentThread().getName()+":"+i);

}

}

}

 

 * 方式二:实现Runnable接口

 *                1.自定义一个类实现Runnable接口

 *                2.实现Runnable 接口中run 方法,把自定义线程的任务代码自定义run方法上。

 *                3.创建Runnable实现类的对象。

 *                4.创建thread 对象。并且把Runnable 实现类作为参数传递。

 *                5.调用Thread 对象Start方法 启动线程。

 *                

 * 线程安全出现的原因:

 *                1.必须要存在两个或两个以上的线程共享的一个资源。

 *                2.操作共享资源的代码必须有两句或者两句以上。

 *

 *

 * 线程安全问题的解决方案:

 * 1.同步代码块。

 *         synchronized(){

 *                需要被同步的代码!

 *  }

 * class Bank{ 

 

    private int sum; 

    public void add(int n){ 

     

         sum+=n; 

        System.out.println("sum="+sum); 

     

    } 

 

 

class Cus implementsRunnable{

 

 private Bank b=new Bank(); 

   public void run(){ 

     synchronized(b){    

         for(int x=0;x<3;x++) 

         { 

            b.add(100); 

          

         } 

     } 

   } 

 

}

 

 

public class demo1{

 

publicstatic void main(String[] args){

 

    Cus c=new Cus(); 

        Thread t1=new Thread(c); 

        Thread t2=new Thread(c); 

        t1.start(); 

        t2.start(); 

}

}

 *

 * 2.同步函数。

 *

 *        修饰符synchronized 返回值类型    函数名(形参列表..){

 *

 *

 *

 * }

 *

 *

 * 注意:1.同步代码块的锁可以是任意的对象。        同步函数的锁是固定的,非静态函数的所对象是this对象。静态函数的锁对象是class对象。

 *           2.锁对象必须是多线程共享对象。否则锁不住。

 *           3.在同步代码块或者是同步函数中用Sleep方法是不会释放锁对象的,如果是调用了wait方法 ,会释放锁对象。

 *

 */

 

packagecom.tgb.thread;

 

 

 

class Bank{ 

 

    private int sum; 

    public synchronized void add(int n){ 

      Object obj=new Object();

         sum+=n; 

         try {

Thread.sleep(1000);

}catch (InterruptedException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}

        System.out.println("sum="+sum); 

     

    } 

 

 

class Cus implementsRunnable{

 

 private Bank b=new Bank(); 

   public void run(){ 

      

         for(int x=0;x<3;x++) 

         { 

            b.add(100); 

          

         } 

   

   } 

 

}

 

 

public class demo1{

 

publicstatic void main(String[] args){

 

    Cus c=new Cus(); 

        Thread t1=new Thread(c); 

        Thread t2=new Thread(c); 

        t1.start(); 

        t2.start(); 

}

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值