多线程

来源:互联网 发布:怎么提取软件源码 编辑:程序博客网 时间:2024/06/01 22:30

/*

 * 线程:

 *

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

 *

 * 自定义线程创建方式:

 *        方式一:继承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(); 

}

}

0 0
原创粉丝点击