java join yield_java中join和yield有什么区别?

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值