sleep执行后线程进入阻塞状态
yield执行后线程进入就绪状态
join执行后线程进入阻塞状态
main()
{
threadA.join(); //等线程A执行完,再执行主线程 .............
}
class BThread extends Thread
{
public BThread()
{
super("[BThread] Thread");
};
public void run()
{
String threadName = Thread.currentThread().getName();
System.out.println(threadName + " start.");
try
{
for (int i = 0; i < 5; i++)
{
System.out.println(threadName + " loop at " + i);
Thread.sleep(1000);
}
System.out.println(threadName + " end.");
} catch (Exception e)
{
System.out.println("Exception from " + threadName + ".run");
}
}
}
class AThread extends Thread
{
BThread bt;
public AThread(BThread bt)
{
super("[AThread] Thread");
this.bt = bt;
}
public void run()
{
String threadName = Thread.currentThread().getName();
System.out.println(threadName + " start.");
try
{
bt.join();
System.out.println(threadName + " end.");
} catch (Exception e)
{
System.out.println("Exception from " + threadName + ".run");
}
}
}
public class TestDemo
{
public static void main(String[] args)
{
String threadName = Thread.currentThread().getName();
System.out.println(threadName + " start.");
BThread bt = new BThread();
AThread at = new AThread(bt);
try
{
bt.start();
Thread.sleep(2000);
at.start();
at.join();
} catch (Exception e)
{
System.out.println("Exception from main");
}
System.out.println(threadName + " end!");
}
}
main start. //主线程起动,因为调用了at.join(),要等到at结束了,此线程才能向下执行。[BThread] Thread start.
[BThread] Thread loop at 0
[BThread] Thread loop at 1
[AThread] Thread start. //线程at启动,因为调用bt.join(),等到bt结束了才向下执行。[BThread] Thread loop at 2
[BThread] Thread loop at 3
[BThread] Thread loop at 4
[BThread] Thread end.
[AThread] Thread end. // 线程AThread在bt.join();阻塞处起动,向下继续执行的结果main end! //线程AThread结束,此线程在at.join();阻塞处起动,向下继续执行的结果。
修改下代码:
public class TestDemo
{
public static void main(String[] args)
{
String threadName = Thread.currentThread().getName();
System.out.println(threadName + " start.");
BThread bt = new BThread();
AThread at = new AThread(bt);
try
{
bt.start();
Thread.sleep(2000);
at.start();
//at.join(); //在此处注释掉对join()的调用 } catch (Exception e)
{
System.out.println("Exception from main");
}
System.out.println(threadName + " end!");
}
}
main start. // 主线程起动,因为Thread.sleep(2000),主线程没有马上结束;
[BThread] Thread start. //线程BThread起动[BThread] Thread loop at 0
[BThread] Thread loop at 1
main end! // 在sleep两秒后主线程结束,AThread执行的bt.join();并不会影响到主线程。[AThread] Thread start. //线程at起动,因为调用了bt.join(),等到bt结束了,此线程才向下执行。[BThread] Thread loop at 2
[BThread] Thread loop at 3
[BThread] Thread loop at 4
[BThread] Thread end. //线程BThread结束了[AThread] Thread end. // 线程AThread在bt.join();阻塞处起动,向下继续执行的结果
修改的例子也说明主线程的执行结束,不影响子线程的继续执行。
-----------------------------------------------------------------------
Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。
yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。
结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。
public class TestYield
{
public static void main(String[] args) throws InterruptedException
{
MyThread t1 = new MyThread("t1");
MyThread t2 = new MyThread("t2");
t1.start();
t2.start();
}
}
class MyThread extends Thread
{
MyThread(final String threadName)
{
super(threadName);
}
public void run()
{
for (int i = 1; i <= 100; i++)
{
if (i < 100 && getName().equals("t1"))
yield();
System.out.println(getName() + ":" + i);
}
}
}
并没有保证2先于1执行完毕
t1:1
t2:1
t1:2
t1:3
t2:2
t2:3
t2:4
t1:4
t1:5
t1:6
t2:5
t2:6
t2:7
t1:7
t1:8
t1:9
t2:8
t2:9
t2:10
t1:10
t1:11
t1:12
t1:13
t2:11
t2:12
t1:14
t1:15
t1:16
t2:13
t2:14
t1:17
t2:15
t2:16
t1:18
t1:19
t1:20
t1:21
t1:22
t1:23
t1:24
t2:17
t2:18
t2:19
t2:20
t2:21
t1:25
t1:26
t2:22
t1:27
t1:28
t2:23
t1:29
t2:24
t1:30
t1:31
t2:25
t1:32
t2:26
t1:33
t1:34
t2:27
t1:35
t2:28
t1:36
t1:37
t2:29
t1:38
t2:30
t1:39
t1:40
t2:31
t1:41
t2:32
t1:42
t1:43
t2:33
t1:44
t2:34
t1:45
t1:46
t2:35
t1:47
t2:36
t1:48
t1:49
t2:37
t1:50
t2:38
t1:51
t1:52
t2:39
t1:53
t2:40
t1:54
t1:55
t1:56
t1:57
t1:58
t1:59
t2:41
t1:60
t1:61
t2:42
t1:62
t2:43
t1:63
t2:44
t1:64
t2:45
t1:65
t2:46
t1:66
t2:47
t1:67
t2:48
t1:68
t2:49
t1:69
t2:50
t1:70
t2:51
t1:71
t2:52
t1:72
t2:53
t1:73
t2:54
t1:74
t2:55
t1:75
t2:56
t1:76
t2:57
t1:77
t2:58
t1:78
t2:59
t1:79
t2:60
t1:80
t2:61
t1:81
t2:62
t1:82
t2:63
t1:83
t2:64
t1:84
t2:65
t1:85
t2:66
t1:86
t2:67
t1:87
t2:68
t1:88
t2:69
t1:89
t2:70
t1:90
t2:71
t1:91
t2:72
t1:92
t2:73
t1:93
t2:74
t1:94
t2:75
t1:95
t2:76
t1:96
t2:77
t1:97
t2:78
t1:98
t2:79
t1:99
t2:80
t1:100
t2:81
t2:82
t2:83
t2:84
t2:85
t2:86
t2:87
t2:88
t2:89
t2:90
t2:91
t2:92
t2:93
t2:94
t2:95
t2:96
t2:97
t2:98
t2:99
t2:100