java多线程总结

来源:互联网 发布:betterfps用什么算法 编辑:程序博客网 时间:2024/06/01 07:18
1.Java多线程(全)学习笔记(下) http://blog.csdn.net/cloudyxuq/article/details/6941588
2.Java多线程学习笔记     http://huagenli.iteye.com/blog/511414
3.Java多线程随笔       http://www.cnblogs.com/justprograme/category/421845.html
5.Java多线程学习笔记     http://www.cnblogs.com/justprograme/archive/2012/10/22/2734182.html
6.java多线程编程     http://www.cnblogs.com/justprograme/archive/2012/10/22/2733984.html



1.  runnable和Thread操作共享数据的区别

总结:根据源代码中Thread类构造方法  Ruanalbe接口对象target只能作为参数传递到Thread构造方法中,所以多个线程可以共用一个Runnable对象,因为都用同一个Runnable对象所以在Runnable实现类的实例变量也可以共享了。

所以Runable非常适合多个相同线程来处理同一份资源的情况。


总结 :从上面结果可以看出由同一个FirstThread类生成的Thread-0和Thread-1两条线程实例,输出的i变量都不连续(注意:i变量是FirestThread的实例属性,而不是局部变量,但因为程序每次创建线程都会创建一个FirstThread对象,所以Thread-0和Thread-1不能共享该实例属性)。

使用继承Thread类的方法来创建线程类,多条线程之间无法共享线程类的实例变量。





2.  线程同步指多个线程同时操作同一个类实例而言的,同一类的不同类实例的相同方法是不存在共享/同步问题的(可以理解为:同类的不同实例的代码块是不同的),所以同步问题存在着以下几种可能:
a. 不同线程对同一个实例进行操作
  1. public class Test {  
  2. public static void main(String []args){  
  3. //创建一个用户没余额,等待先存款后取钱  
  4. Account acct=new Account("123张",0);  //不同线程对同一个实例进行操作
  5. //取款800  
  6. new Thread(new DrawThread(acct,800),"取款者").start();  
  7. //存款2个人  
  8. new Thread(new DepositThread(acct,800),"存款者甲").start();  
  9. new Thread(new DepositThread(acct,800),"存款者乙").start();  
  10. new Thread(new DepositThread(acct,800),"存款者丙").start();  
  11. }  

b.  不同线程共享一个静态对象(多个线程共享一段代码)/**=============================================================================
 * 文件:ThreadDemo_05.java
 * 描述:多线程不同步的解决方法--锁
 * =============================================================================
 */
// 共享一个静态数据对象
class ShareData{
 public static String szData = "";
}


class ThreadDemo extends Thread{
  
  private ShareData oShare;


  ThreadDemo(){
  }


  ThreadDemo(String szName,ShareData oShare){
    super(szName);
    this.oShare = oShare;
  }


  public void run(){
    // 为了更清楚地看到不正确的结果,这里放一个大的循环
  for (int i = 0; i < 50; i++){
       if (this.getName().equals("Thread1")){
         // 锁定oShare共享对象
         synchronized (oShare){
           oShare.szData = "这是第 1 个线程";
           // 为了演示产生的问题,这里设置一次睡眠
       try{
             Thread.sleep((int)Math.random() * 100);
           catch(InterruptedException e){
           }
           // 输出结果
           System.out.println(this.getName() + ":" + oShare.szData);
         }
       }else if (this.getName().equals("Thread2")){
         // 锁定共享对象
         synchronized (oShare){
           oShare.szData = "这是第 1 个线程";
           // 为了演示产生的问题,这里设置一次睡眠
       try{
             Thread.sleep((int)Math.random() * 100);
           catch(InterruptedException e){
           }
           // 输出结果
           System.out.println(this.getName() + ":" + oShare.szData);
         }
       }
   }
}


class ThreadMain{
  public static void main(String argv[]){
    ShareData oShare = new ShareData();
    ThreadDemo th1 = new ThreadDemo("Thread1",oShare);
    ThreadDemo th2 = new ThreadDemo("Thread2",oShare);


    th1.start();
    th2.start();
  }
}

c. 不同线程对同一数据进行操作(类似a)/* ==================================================================================
 * 文件:ThreadDemo08.java
 * 描述:生产者--消费者
 * ==================================================================================
 */


class ShareData{
 
 private char c;
 // 通知变量
 private boolean writeable = true;


 // ------------------------------------------------------------------------- 
 // 需要注意的是:在调用wait()方法时,需要把它放到一个同步段里,否则将会出现
 // "java.lang.IllegalMonitorStateException: current thread not owner"的异常。
 // -------------------------------------------------------------------------
 public synchronized void setShareChar(char c){
  if (!writeable){
   try{
    // 未消费等待
    wait();
   }catch(InterruptedException e){}
  }
  
  this.c = c;
  // 标记已经生产
  writeable = false;
  // 通知消费者已经生产,可以消费
  notify();
 }
 
 public synchronized char getShareChar(){
  if (writeable){
   try{
    // 未生产等待
    wait();
   }catch(InterruptedException e){}  
  }
  // 标记已经消费
  writeable = true;
  // 通知需要生产
  notify();
  return this.c;
 }
}


// 生产者线程
class Producer extends Thread{
 
 private ShareData s;
 
 Producer(ShareData s){
  this.s = s;
 }
 
 public void run(){
  for (char ch = 'A'; ch <= 'Z'; ch++){
   try{
    Thread.sleep((int)Math.random() * 400);
   }catch(InterruptedException e){}
   
   s.setShareChar(ch);
   System.out.println(ch + " producer by producer.");
  }
 }
}


// 消费者线程
class Consumer extends Thread{
 
 private ShareData s;
 
 Consumer(ShareData s){
  this.s = s;
 }
 
 public void run(){
  char ch;
  
  do{
   try{
    Thread.sleep((int)Math.random() * 400);
   }catch(InterruptedException e){}
  
   ch = s.getShareChar();
   System.out.println(ch + " consumer by consumer.**");
  }while (ch != 'Z');
 }
}


class Test{
 public static void main(String argv[]){
  ShareData s = new ShareData();    //共用的数据类
  new Consumer(s).start();
  new Producer(s).start();
 }
}
0 0
原创粉丝点击