`
edr_
  • 浏览: 171110 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

浅谈Java线程启动与Thread.join()

    博客分类:
  • J2SE
阅读更多
java中线程的启动有两种方式:
class T extends Thread{
	String name;
	public T(String n){
		name=n;
	}
	public void run() {
		try {
			for (int i = 0; i < 2; i++) {
				System.out.println("-------"+name);
			}
		} catch (Exception e) {}
	}
}
class T1 implements Runnable{
	String name;
	public T1(String n){
		name=n;
	}
	@Override
	public void run() {
		try {
			for (int i = 0; i < 2; i++) {
				System.out.println("-------"+name);
			}
		} catch (Exception e) {}
	}
}
启动:
public class Join_Thread {
	public static void main(String[] args) {
		T j1=new T("J1");
		j1.start();
		Thread t3=new Thread(new T1("T_Runable"));
		t3.start();
		System.out.println("Thred End!!");
	}
}

java中的join方法:
public class Join_Thread {
	public static void main(String[] args) {
		T j1=new T("J1");
		j1.start();
		try {
			j1.join();
		} catch (Exception e) {}
		T j2=new T("J2");
		j2.start();
		try {
			j2.join();
		} catch (Exception e) {	}
		System.out.println("Join Thred End!!");
	}
}
join();//等待该线程终止。 
join(long millis);//等待该线程终止的时间最长为 millis 毫秒。
join(long millis,int nanos);//等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。

当使用join(long millis)时相当于在主线程中只能等待这么多时间,超过时则继续主线程的函数流程,一直到等到线程苏醒,然后继续线程的运行。
借鉴一个网友的解释:
比如:你准备洗澡,需要准备的步骤,准备好衣服,沐浴的东西及烧水这些事情,由于烧水耗时太长,如果也放在主线程之中,就很浪费资源,所以如果我们另开线程去处理,就会达到很好效果,于是乎在准备好衣服,沐浴的东西之前就去开子线程烧水,烧水的过程中主线程准备好衣服,沐浴的东西,此时就等待水烧好,然后方可痛快的洗澡了!!
修正:
更容易理解版本:准备洗澡--烧水(15秒)--等开水(5秒)--太久了,开始准备衣服(5)--衣服准备好了--等开水--水开了,可以洗澡了
class T1 extends Thread{
	String name;
	public T1(String n){name=n;}
	public void run() {
		try {
			System.out.println(name+"-------"+"在烧水中!");
			sleep(15000);
			System.out.println(name+"-------"+"烧水烧好了!");
		} catch (Exception e) {}
	}
}
class T2 extends Thread{
	String name;
	public T2(String n){
		name=n;
	}
	public void run() {
		try {
			System.out.println(name+"-------"+"准备洗澡!");
			System.out.println(name+"-------"+":先准备开水吧!");
			T1 j2=new T1("Join1");
			j2.start();
			try {
				j2.join(5000);
				System.out.println("等开水等了5秒,实在等不及了,开始准备衣服吧!");
			} catch (Exception e) {}
			System.out.println(name+"-------"+"在准备衣服5秒钟!");
			for (int i = 0; i <5; i++) {
				System.out.println(name+"-------"+"在准备衣服中!");
				sleep(1000);
			}
			System.out.println(name+"-------"+"衣服准备好了!");
			sleep(6000);
			System.out.println(name+"-------"+"全部准备好了,可以开始洗澡了!");
		} catch (Exception e) {}
	}
}
public class Join_Thread {
	
	public static void main(String[] args) {
		T2 j2=new T2("Join2");
		j2.start();
	}
}











1
4
分享到:
评论
4 楼 edr_ 2013-07-12  
wzpwap123 写道
edr_ 写道
wzpwap123 写道
貌似join示例中j1.join()放到j2里面表达洗澡效果更好一些

不懂什么意思?可以来点详细的不?

按照这个main执行,是顺序下来的,没有显示出我烧水的同时换衣服的效果,只是烧完水在换衣服在洗澡的效果,要是把j1.join放到j2就是感觉烧水的同时我换衣服然后等水烧好洗澡

最近在考试,今天考完想了一下,你理解的很通彻啊!非常谢谢!
3 楼 wzpwap123 2013-07-11  
edr_ 写道
wzpwap123 写道
貌似join示例中j1.join()放到j2里面表达洗澡效果更好一些

不懂什么意思?可以来点详细的不?

按照这个main执行,是顺序下来的,没有显示出我烧水的同时换衣服的效果,只是烧完水在换衣服在洗澡的效果,要是把j1.join放到j2就是感觉烧水的同时我换衣服然后等水烧好洗澡
2 楼 edr_ 2013-07-10  
wzpwap123 写道
貌似join示例中j1.join()放到j2里面表达洗澡效果更好一些

不懂什么意思?可以来点详细的不?
1 楼 wzpwap123 2013-07-10  
貌似join示例中j1.join()放到j2里面表达洗澡效果更好一些

相关推荐

    浅谈Java线程Thread.join方法解析

    Java线程Thread.join方法解析 Java线程中的join方法是一个非常重要的概念,它允许一个线程等待另一个线程的结束,以便进行后续的操作。在本篇文章中,我们将详细介绍Java线程Thread.join方法的解析和实现。 首先,...

    浅谈Java线程的生命周期——北大青鸟佳音旗舰.docx

    本文将深入探讨Java线程的生命周期,包括创建、启动、结束以及线程的协作和调度。 首先,创建Java线程有两种主要方式:直接实例化`Thread`类或者创建一个新的类去继承`Thread`类并重写`run()`方法。例如,你可以...

    浅谈java线程join方法使用方法

    浅谈Java线程join方法使用方法 Java中的线程join方法是一种实现线程同步的方式,可以将原本并行执行的多线程方法变成串行执行的。在Java中,线程join方法的作用是使当前线程等待另一个线程的结束,然后再继续执行...

    浅谈java多线程 join方法以及优先级方法

    Java中,线程的优先级范围从`Thread.MIN_PRIORITY`(1)到`Thread.MAX_PRIORITY`(10),默认优先级是`Thread.NORM_PRIORITY`(5)。较高的优先级意味着线程更有可能被操作系统调度执行。然而,需要注意的是,线程...

    浅谈Java获得多线程的返回结果方式(3种)

    3. 使用 FutureTask 的 get 方法(或者 Thread 的 join 方法)阻塞当前线程直到获得任务的结果。 例如,在下面的代码中,我们使用 Callable 和 FutureTask 来获取多线程的返回结果。 ```java import java.util.*;...

    浅谈线程的几种可用状态

    浅谈线程的几种可用状态 线程是操作系统中的一种基本概念,它可以帮助我们更好地管理系统资源和提高系统的效率。线程有多种状态,这些状态之间可以相互转换,了解这些状态对于我们编写高效的多线程程序非常重要。 ...

    浅谈python多线程和队列管理shell程序

    为了能够同时启动这些Java程序,可以采用多线程的方式。但是,单纯的多线程并不能解决所有问题,因为它不能很好地反馈线程执行的结果。因此,引入队列机制是必要的。 #### 三、队列管理的重要性 队列是一种先进先...

    浅谈Java并发编程基础知识

    每一条线程都有一个关联的Thread对象,在并发编程中Java提供了两个基本策略来使用线程对象:直接控制线程的创建和管理,或者将抽象好的任务传递给一个任务执行器。 四、线程通信 线程通信是指多个线程之间的数据...

Global site tag (gtag.js) - Google Analytics