Java多线程、主线程等待所有子线程执行完毕、共享资源
2014-10-13 23:21
711 查看
1.Java创建与启动线程
Java提供两种方式创建和启动线程:1.直接Thread类,2.实现Runable接口。
1.1 继承Thread类
![](http://images.cnitblog.com/blog/498928/201410/132144399049753.jpg)
线程1,2,3,随机执行
注意启动线程一定要用thread.start()而不能用thread.run()。否则则是顺序执行,失去多线程的意义。
输出结果:三个线程顺序执行
![](http://images.cnitblog.com/blog/498928/201410/132148098738665.jpg)
1.2 实现Runnable接口实现
执行结果:随机执行
![](http://images.cnitblog.com/blog/498928/201410/132159390767821.jpg)
2.两种方式有什么不同,再看下面的代码,利用Runnable 实现资源共享,这里的共享知识部分共享
比如售票系统
输出结果:每个线程都卖了5张票,相当于15张票
![](http://images.cnitblog.com/blog/498928/201410/132205287326510.jpg)
那么再来看看使用Runnable 实现三个进程共享系统中的5张票
输出结果:三个线程共享了5张票
![](http://images.cnitblog.com/blog/498928/201410/132218293882406.jpg)
利用实例化一个Runnable对象,实现共享
3.大家注意了,多线程开发中,主线程和子线程是并发执行的,也就是,子线程在执行的过程中,主线程也在往下执行。这就导致了有这么一个需求不好实现。那就是,主线程需要所有子线程返回执行结果才能继续执行。同志们这个怎么实现呢?
ok,我们利用一个CountDownLatch来实现
输出结果:主线程等待所有子线程执行完毕,然后在执行
![](http://images.cnitblog.com/blog/498928/201410/132247086076670.jpg)
4.问题又来了,现实开发中,有可能,需要不同Runnable根据不同的数据执行相同的代码,这个又如何实现呢?
这就又导致了,通过只实例化一个Runnable对象来进行共享资源的方法不可行了。我们可以通过将共享数据封装成一个对象,传给不同的Runnable线程对象。达到资源共享
Java提供两种方式创建和启动线程:1.直接Thread类,2.实现Runable接口。
1.1 继承Thread类
public class myThread extends Thread { public void run(){ for(int i=0;i<5;i++){ System.out.println(this.getName()+":"+i); } } public static void main(String[] args){ //创建3个线程 myThread myThread1 = new myThread(); myThread myThread2 = new myThread(); myThread myThread3 = new myThread(); //启动线程 myThread1.start(); myThread2.start(); myThread3.start(); } }
![](http://images.cnitblog.com/blog/498928/201410/132144399049753.jpg)
线程1,2,3,随机执行
注意启动线程一定要用thread.start()而不能用thread.run()。否则则是顺序执行,失去多线程的意义。
public class myThread extends Thread { public void run(){ for(int i=0;i<5;i++){ System.out.println(this.getName()+":"+i); } } public static void main(String[] args){ //创建3个线程 myThread myThread1 = new myThread(); myThread myThread2 = new myThread(); myThread myThread3 = new myThread(); //启动线程 myThread1.run(); myThread2.run(); myThread3.run(); } }
输出结果:三个线程顺序执行
![](http://images.cnitblog.com/blog/498928/201410/132148098738665.jpg)
1.2 实现Runnable接口实现
public class myRunnable implements Runnable { private String name; public void run() { for(int i=0;i<5;i++){ System.out.println(this.getName()+":"+i); } } public String getName() { return name; } public myRunnable(String name) { super(); this.name = name; } public static void main(String[] args){ //创建3个线程 myRunnable myRunnable1 = new myRunnable("thread1"); myRunnable myRunnable2 = new myRunnable("thread2"); myRunnable myRunnable3 = new myRunnable("thread3"); //启动线程,由于runnable中是没有start方法的,这里要将你的runnable实例作为Thread(Target target)参数,启动线程 //多个Runnable实例,执行相同代码 new Thread(myRunnable1).start(); new Thread(myRunnable2).start(); new Thread(myRunnable3).start(); } }
执行结果:随机执行
![](http://images.cnitblog.com/blog/498928/201410/132159390767821.jpg)
2.两种方式有什么不同,再看下面的代码,利用Runnable 实现资源共享,这里的共享知识部分共享
比如售票系统
public class myThread extends Thread { private int tickets=5;//总共5张票 public void run(){ for(int i=0;i<10;i++){ if(tickets>0){ System.out.println(this.getName()+":"+tickets--); } } } public static void main(String[] args){ //创建3个线程 myThread myThread1 = new myThread(); myThread myThread2 = new myThread(); myThread myThread3 = new myThread(); //启动线程 myThread1.start(); myThread2.start(); myThread3.start(); } }
输出结果:每个线程都卖了5张票,相当于15张票
![](http://images.cnitblog.com/blog/498928/201410/132205287326510.jpg)
那么再来看看使用Runnable 实现三个进程共享系统中的5张票
public class myRunnable implements Runnable { private int tickets=5; public void run() { for(int i=0;i<10;i++){ if(tickets>0){ System.out.println(Thread.currentThread().getName()+"正在卖票:"+tickets--); } } } public static void main(String[] args){ //创建3个线程 myRunnable myRunnable1 = new myRunnable(); //启动线程,由于runnable中是没有start方法的,这里要将你的runnable实例作为Thread(Target target)参数,启动线程 //通过一个Runnable实例,创建3个线程,该三个线程共享tickets这个资源 new Thread(myRunnable1,"1号窗口").start(); new Thread(myRunnable1,"2号窗口").start(); new Thread(myRunnable1,"3号窗口").start(); } }
输出结果:三个线程共享了5张票
![](http://images.cnitblog.com/blog/498928/201410/132218293882406.jpg)
利用实例化一个Runnable对象,实现共享
3.大家注意了,多线程开发中,主线程和子线程是并发执行的,也就是,子线程在执行的过程中,主线程也在往下执行。这就导致了有这么一个需求不好实现。那就是,主线程需要所有子线程返回执行结果才能继续执行。同志们这个怎么实现呢?
ok,我们利用一个CountDownLatch来实现
public class MyRunnableReturn implements Runnable { private CountDownLatch threadsSingal; public MyRunnableReturn(CountDownLatch threadsSingal) { super(); this.threadsSingal = threadsSingal; } public void run() { System.out.println(Thread.currentThread().getName()+"--开始"); System.out.println(Thread.currentThread().getName()+"--结束"); threadsSingal.countDown();//线程减1 } public static void main(String [] agrs){ System.out.println("Main --开始"); CountDownLatch threadsSingal=new CountDownLatch(3); MyRunnableReturn myRunnable=new MyRunnableReturn(threadsSingal); new Thread(myRunnable,"thread1").start(); new Thread(myRunnable,"thread2").start(); new Thread(myRunnable,"thread3").start(); try { threadsSingal.await();//等待所有子线程执行完 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("Main --结束"); } }
输出结果:主线程等待所有子线程执行完毕,然后在执行
![](http://images.cnitblog.com/blog/498928/201410/132247086076670.jpg)
4.问题又来了,现实开发中,有可能,需要不同Runnable根据不同的数据执行相同的代码,这个又如何实现呢?
这就又导致了,通过只实例化一个Runnable对象来进行共享资源的方法不可行了。我们可以通过将共享数据封装成一个对象,传给不同的Runnable线程对象。达到资源共享
相关文章推荐
- Java多线程--让主线程等待所有子线程执行完毕代码
- java多线程实现主线程等待所有子线程执行完毕
- Java多线程--让主线程等待所有子线程执行完毕
- Java多线程--让主线程等待所有子线程执行完毕(转)
- Java多线程--让主线程等待所有子线程执行完毕
- Java多线程--让主线程等待所有子线程执行完毕
- [置顶] [转]Java多线程--让主线程等待所有子线程执行完毕
- Java多线程--让主线程等待所有子线程执行完毕
- Java多线程--主线程等待所有子线程执行完毕
- Java多线程--让主线程等待所有子线程执行完毕
- Java多线程--让主线程等待所有子线程执行完毕在执行
- Java多线程--让主线程等待所有子线程执行完毕【转】
- Java主线程等待所有子线程执行完毕再执行解决办法集
- Java主线程等待所有子线程执行完毕再执行解决办法
- Java主线程等待所有子线程执行完毕再执行解决办法(转)
- java主线程等待所有子线程执行完毕在执行(常见面试题)
- Java主线程等待所有子线程执行完毕再执行解决办法
- Java主线程等待所有子线程执行完毕再执行解决办法集
- Java主线程等待所有子线程执行完毕再执行解决办法集
- java主线程等待所有子线程执行完毕在执行(常见面试题)