thread.join函数,java多线程中的join函数解析

join函数的作用,是让当前线程等待,直到调用join()的 线程结束或者等到一段时间,我们来看以下代码

 1 package mian;
 2
 3
 4 public class simpleplela {
 5     static void threadMessage(String message) {
 6         String threadName =
 7                 Thread.currentThread().getName();
 8
 9           System.out.println(threadName+"   "+message
10                    );
11     }
12
13     private static class MessageLoop
14         implements Runnable {
15         public void run(){
16
17
18         String importantInfo[] = {
19                 "ONe",
20                 "TWo",
21                 "THREe",
22                 "four"
23             };
24         try{
25             for(int i = 0;
26                     i<importantInfo.length;
27                     i++){
28                 Thread.sleep(4000);
29                 threadMessage(importantInfo[i]);
30             }
31         }
32         catch(InterruptedException e){
33             threadMessage("I was‘nt done!");
34         }
35     }
36     }
37     public static void main(String args[])
38         throws InterruptedException {
39         long patience = 1000*10;
40         if(args.length>0){
41             try{
42                 patience = Long.parseLong(args[0])*1000;
43             }catch(NumberFormatException e){
44                 System.err.println("Argument must be an integer");
45                 System.exit(1);
46             }
47         }
48         threadMessage("Starting MessageLoop Thread");
49         long startTime = System.currentTimeMillis();
50         Thread t = new Thread(new MessageLoop());
51         t.start();
52         threadMessage("Waiting for MEssageLoop Thread to finish");
53         while((t.isAlive())){
54             threadMessage("still waiting...");
55
56             t.join();
57             if (((System.currentTimeMillis() - startTime) > patience)
58                     && t.isAlive()) {
59                 threadMessage("Tired of waiting!");
60                 t.interrupt();
61                 // Shouldn‘t be long now
62                 // -- wait indefinitely
63                 t.join();
64             }
65             }
66         threadMessage("Finally!");
67     }
68
69 }

输出如下

 1 package mian;
 2
 3
 4 public class simpleplela {
 5     static void threadMessage(String message) {
 6         String threadName =
 7                 Thread.currentThread().getName();
 8
 9           System.out.println(threadName+"   "+message
10                    );
11     }
12
13     private static class MessageLoop
14         implements Runnable {
15         public void run(){
16
17
18         String importantInfo[] = {
19                 "ONe",
20                 "TWo",
21                 "THREe",
22                 "four"
23             };
24         try{
25             for(int i = 0;
26                     i<importantInfo.length;
27                     i++){
28                 Thread.sleep(4000);
29                 threadMessage(importantInfo[i]);
30             }
31         }
32         catch(InterruptedException e){
33             threadMessage("I was‘nt done!");
34         }
35     }
36     }
37     public static void main(String args[])
38         throws InterruptedException {
39         long patience = 1000*10;
40         if(args.length>0){
41             try{
42                 patience = Long.parseLong(args[0])*1000;
43             }catch(NumberFormatException e){
44                 System.err.println("Argument must be an integer");
45                 System.exit(1);
46             }
47         }
48         threadMessage("Starting MessageLoop Thread");
49         long startTime = System.currentTimeMillis();
50         Thread t = new Thread(new MessageLoop());
51         t.start();
52         threadMessage("Waiting for MEssageLoop Thread to finish");
53         while((t.isAlive())){
54             threadMessage("still waiting...");
55
56             t.join(1000);
57             if (((System.currentTimeMillis() - startTime) > patience)
58                     && t.isAlive()) {
59                 threadMessage("Tired of waiting!");
60                 t.interrupt();
61                 // Shouldn‘t be long now
62                 // -- wait indefinitely
63                 t.join();
64             }
65             }
66         threadMessage("Finally!");
67     }
68
69 }

输出如下 我们分析一下,两段代码只有一行不一样。第一段是t.join(),会让当前线程(例子中为主线程)一直等待,知道t结束;

第二段是t.join(1000),会让当前线程等待1000毫秒,之后继续。

thread.join函数,java多线程中的join函数解析,布布扣,bubuko.com

时间: 2024-08-05 06:38:12

thread.join函数,java多线程中的join函数解析的相关文章

Java多线程中的join方法

新建一个Thread,代码如下: 1 package com.thread.test; 2 3 public class MyThread extends Thread { 4 private String name; 5 public MyThread(String name) { 6 this.name = name; 7 } 8 @Override 9 public void run() { 10 for (int i = 0; i < 100; i++) { 11 System.out.

java多线程中join用法

thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. package com.wzs; /** * Java多线程中join用法 * * @author Administrator * */ public class JoinTest { public static void main(String[] args) { BThread bThread = new B

Java多线程中的Runnable和Thread

摘要: 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限. 用法: Thread: package org.thread.demo;class MyThread extends Thread{ private String name; public MyThread(Stri

转 Java多线程中Sleep与Wait的区别

Java中的多线程是一种抢占式的机制,而不是分时机制.抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行. 共同点: 1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回. 2. wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException. 如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法.如果此刻线程B正在wait/sleep/

Java多线程中的竞争条件、锁以及同步的概念

竞争条件 1.竞争条件: 在java多线程中,当两个或以上的线程对同一个数据进行操作的时候,可能会产生"竞争条件"的现象.这种现象产生的根本原因是因为多个线程在对同一个数据进行操作,此时对该数据的操作是非"原子化"的,可能前一个线程对数据的操作还没有结束,后一个线程又开始对同样的数据开始进行操作,这就可能会造成数据结果的变化未知. package com.huojg.test; public class TestThread { public static void

java学习中,匿名函数、构造方法、构造代码块、构造方法中调用构造方法(java 学习中的小记录)

java学习中,匿名函数.构造方法.构造代码块.构造方法中调用构造方法(java 学习中的小记录) 作者:王可利(Star·星星) 匿名函数 匿名对象:没有名字的对象 匿名对象使用的注意点: 1.一般不会用匿名对象给属性赋值,无法获取属性值,每次new 都是一个新的对象. 2.匿名对象永远都不可能是一个对象. 如:person new().name = "星星":是不行的 匿名对象的好处:书写简单. 匿名对象使用的场景: 1.如果一个对象调用一个方法一次的时候,就可以用匿名对象来调用.

Java多线程中的死锁问题[转]

//申明:本文转载自http://www.cnblogs.com/digdeep/p/4448148.html <Java多线程中的死锁问题> Java程序基本都要涉及到多线程,而在多线程环境中不可避免的要遇到线程死锁的问题.Java不像数据库那么能够检测到死锁,然后进行处理,Java中的死锁问题,只能通过程序员自己写代码时避免引入死锁的可能性来解决. 1. Java中导致死锁的原因 Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得

(转)Python3:sorted()函数及列表中的sort()函数

Python3:sorted()函数及列表中的sort()函数 转载请注明作者和出处:http://blog.csdn.net/u011475210 操作系统:WINDOWS 10 软件版本:python-3.6.2-amd64 编??者:WordZzzz 一.sort,sorted函数介绍: ??Sort函数是list列表中的函数,而sorted可以对list或者iterator进行排序. ??下面我们使用help来查看他们的用法及功能: sort: >>> help(list.sor

python3中的 zip()函数 和python2中的 zip()函数 的区别

python3中的 zip()函数 和python2中的 zip()函数 的区别: 描述: zip() 函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象. 如果各个可迭代对象的元素个数不一致,则返回的对象长度与最短的可迭代对象相同. 利用 * 号操作符,与zip相反,进行解压. zip() 函数语法: zip(iterable1,iterable2, ...) 参数说明: iterable -- 一个或多个可迭代对象(字符串.列表.元祖.字典) 返回