Robin's Blog

记录 积累 学习 成长

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

在开发中多线程并发问题,数据安全,很重要,

如果用了多线程就不的不考虑数据安全,

如何让主线程等待所有子线程都执行完,在继续执行?

方法很多,

1.在主方法中做现场数标记,如果有子线程没执行完就循环检测。

2.Thread.join()方法等待线程结束。

第一种方法:

  1. package com.yangtb.Thread;  
  2.   
  3. import java.util.Random;  
  4.   
  5. public class ThreadJoin {  
  6.     int intThreadNum;//记录子线程个数  
  7.   
  8.     /** 
  9.      * @param args 
  10.      */  
  11.     public static void main(String[] args) {  
  12.         // TODO Auto-generated method stub  
  13.         ThreadJoin tj = new ThreadJoin();  
  14.         tj.run();  
  15.         System.out.println("主线程结束");  
  16.     }  
  17.       
  18.       
  19.       
  20.     class Work implements Runnable{  
  21.         String name;  
  22.         int sleeptime;  
  23.         Work(String name, int sleeptime){  
  24.             this.name = name;  
  25.             this.sleeptime=sleeptime;  
  26.         }  
  27.         public void run() {  
  28.               
  29.             // TODO Auto-generated method stub  
  30.             try {  
  31.                                //线程加1  
  32.                 upThread();  
  33.                 Thread.sleep(sleeptime);  
  34.                 System.out.println(name+"---end---sleep :"+sleeptime);  
  35.   
  36.                 downThread();//线程减1  
  37.             } catch (InterruptedException e) {  
  38.                 // TODO Auto-generated catch block  
  39.                 e.printStackTrace();  
  40.             }  
  41.         }  
  42.           
  43.     }  
  44.       
  45.       
  46.       
  47.     public  void run(){  
  48.           
  49.         int time = 10000;  
  50.         Random r = new Random();  
  51.         Thread[] rs = new Thread[10];  
  52.         for(int i =0;i<10;i++){  
  53.               
  54.             rs[i] =new Thread(new Work(i+"",r.nextInt(time)));  
  55.             rs[i].start();  
  56.             System.out.println(i+"--Start---");  
  57.         }  
  58.           
  59.   
  60.         //每隔1秒检查是否还有线程,如果有就等1秒在检查,如果没有就结束  
  61.         while(isok()){  
  62.             try {  
  63.                 Thread.sleep(1000);  
  64.             } catch (InterruptedException e) {  
  65.                 // TODO Auto-generated catch block  
  66.                 e.printStackTrace();  
  67.             }  
  68.         }  
  69.           
  70.         System.out.println("----end--");  
  71.     }  
  72.     //线程结束  
  73.     private synchronized void downThread(){  
  74.         intThreadNum--;  
  75.     }  
  76.     //线程开始  
  77.     private synchronized void upThread(){  
  78.         intThreadNum++;  
  79.     }  
  80.     //检查现场数  
  81.     private synchronized boolean isok(){  
  82.         return intThreadNum>0;  
  83.     }  
  84.       
  85. }  

 

第二种方法:Thread.join();

  1. package com.yangtb.Thread;  
  2.   
  3. import java.util.Random;  
  4.   
  5. public class ThreadJoin {  
  6.       
  7.     /** 
  8.      * @param args 
  9.      */  
  10.     public static void main(String[] args) {  
  11.         // TODO Auto-generated method stub  
  12.         ThreadJoin tj = new ThreadJoin();  
  13.         tj.run();  
  14.         System.out.println("主线程结束");  
  15.     }  
  16.       
  17.       
  18.       
  19.     class Work implements Runnable{  
  20.         String name;  
  21.         int sleeptime;  
  22.         Work(String name, int sleeptime){  
  23.             this.name = name;  
  24.             this.sleeptime=sleeptime;  
  25.         }  
  26.         public void run() {  
  27.               
  28.             // TODO Auto-generated method stub  
  29.             try {  
  30.                   
  31.                 Thread.sleep(sleeptime);  
  32.                 System.out.println(name+"---end---sleep :"+sleeptime);  
  33.                   
  34.             } catch (InterruptedException e) {  
  35.                 // TODO Auto-generated catch block  
  36.                 e.printStackTrace();  
  37.             }  
  38.         }  
  39.           
  40.     }  
  41.       
  42.       
  43.       
  44.     public  void run(){  
  45.           
  46.         int time = 10000;  
  47.         Random r = new Random();  
  48.         Thread[] rs = new Thread[10];  
  49.         for(int i =0;i<10;i++){  
  50.               
  51.             rs[i] =new Thread(new Work(i+"",r.nextInt(time)));  
  52.             rs[i].start();  
  53.             System.out.println(i+"--Start---");  
  54.         }  
  55.           
  56.         for(Thread rtemp : rs){  
  57.             try {  
  58.                 rtemp.join();  
  59.             } catch (InterruptedException e) {  
  60.                 // TODO Auto-generated catch block  
  61.                 e.printStackTrace();  
  62.             }  
  63.         }  
  64.         for(Thread rtemp : rs){  
  65.             try {  
  66.                 rtemp.join();  
  67.             } catch (InterruptedException e) {  
  68.                 // TODO Auto-generated catch block  
  69.                 e.printStackTrace();  
  70.             }  
  71.         }  
  72.                   
  73.         System.out.println("----end--");  
  74.     }  
  75.       
  76.       
  77.       
  78. }  

 

posted on 2010-04-14 16:59  Robin99  阅读(2994)  评论(0编辑  收藏  举报