join的作用,就是让调用它的线程先执行,等它die之后,然后再执行其他线程。

测试代码:

package com.concurrent;

import junit.framework.TestCase;

public class TestJoin extends TestCase {
	public void testJoin1() {
		ThreadTest tt = new ThreadTest();
		Thread t = new Thread(tt);
		t.start();
		System.out.println("TestJoin");
	}
	
	public void testJoin2() {
		ThreadTest tt = new ThreadTest();
		Thread t = new Thread(tt);
		t.start();
		try {
			Thread.sleep(1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("TestJoin");
	}
	
	public void testJoin3() {
		ThreadTest tt = new ThreadTest();
		Thread t = new Thread(tt);
		t.start();
		try {
			t.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("TestJoin");
	}

	static class ThreadTest implements Runnable {

		@Override
		public void run() {
			for (int i = 0; i < 400; i++) {
				System.out.println("ThreadTest.run" + i);
			}

		}

	}
}



看testJoin1,启动一个线程,这个线程会输出400个ThreadTest.run,然后输出TestJoin,运行一下:

TestJoin
ThreadTest.run0
ThreadTest.run1
ThreadTest.run2
ThreadTest.run3
ThreadTest.run4
ThreadTest.run5
ThreadTest.run6
ThreadTest.run7
ThreadTest.run8
ThreadTest.run9
ThreadTest.run10
ThreadTest.run11
ThreadTest.run12
ThreadTest.run13
ThreadTest.run14
ThreadTest.run15
ThreadTest.run16
ThreadTest.run17
ThreadTest.run18
ThreadTest.run19
ThreadTest.run20
ThreadTest.run21
ThreadTest.run22
ThreadTest.run23
ThreadTest.run24
ThreadTest.run25
ThreadTest.run26
ThreadTest.run27
ThreadTest.run28
ThreadTest.run29
ThreadTest.run30
ThreadTest.run31
ThreadTest.run32
ThreadTest.run33
ThreadTest.run34
ThreadTest.run35
ThreadTest.run36
ThreadTest.run37
ThreadTest.run38
ThreadTest.run39
ThreadTest.run40
ThreadTest.run41
ThreadTest.run42
ThreadTest.run43
ThreadTest.run44
ThreadTest.run45
ThreadTest.run46
ThreadTest.run47
ThreadTest.run48
ThreadTest.run49
ThreadTest.run50
ThreadTest.run51
ThreadTest.run52
ThreadTest.run53
ThreadTest.run54
ThreadTest.run55
ThreadTest.run56
ThreadTest.run57
ThreadTest.run58
ThreadTest.run59
ThreadTest.run60
ThreadTest.run61
ThreadTest.run62
ThreadTest.run63
ThreadTest.run64
ThreadTest.run65



发现测试结果是先输出TestJoin,然后输出ThreadTest.run,也没有到400个。

如果要先输出400个ThreadTest.run,然后输出TestJoin,该怎么办?看testJoin2,运行一下,结果:

ThreadTest.run0
ThreadTest.run1
ThreadTest.run2
ThreadTest.run3
ThreadTest.run4
ThreadTest.run5
ThreadTest.run6
ThreadTest.run7
ThreadTest.run8
ThreadTest.run9
ThreadTest.run10
ThreadTest.run11
ThreadTest.run12
ThreadTest.run13
ThreadTest.run14
ThreadTest.run15
ThreadTest.run16
ThreadTest.run17
ThreadTest.run18
ThreadTest.run19
ThreadTest.run20
ThreadTest.run21
ThreadTest.run22
ThreadTest.run23
ThreadTest.run24
ThreadTest.run25
ThreadTest.run26
ThreadTest.run27
ThreadTest.run28
ThreadTest.run29
ThreadTest.run30
ThreadTest.run31
ThreadTest.run32
ThreadTest.run33
ThreadTest.run34
ThreadTest.run35
ThreadTest.run36
ThreadTest.run37
ThreadTest.run38
ThreadTest.run39
ThreadTest.run40
ThreadTest.run41
ThreadTest.run42
ThreadTest.run43
ThreadTest.run44
ThreadTest.run45
ThreadTest.run46
ThreadTest.run47
ThreadTest.run48
ThreadTest.run49
ThreadTest.run50
ThreadTest.run51
ThreadTest.run52
ThreadTest.run53
ThreadTest.run54
ThreadTest.run55
ThreadTest.run56
ThreadTest.run57
ThreadTest.run58
ThreadTest.run59
ThreadTest.run60
ThreadTest.run61
ThreadTest.run62
ThreadTest.run63
ThreadTest.run64
ThreadTest.run65
ThreadTest.run66
ThreadTest.run67
ThreadTest.run68
ThreadTest.run69
ThreadTest.run70
ThreadTest.run71
ThreadTest.run72
ThreadTest.run73
ThreadTest.run74
ThreadTest.run75
ThreadTest.run76
ThreadTest.run77
ThreadTest.run78
ThreadTest.run79
ThreadTest.run80
ThreadTest.run81
ThreadTest.run82
ThreadTest.run83
ThreadTest.run84
ThreadTest.run85
ThreadTest.run86
ThreadTest.run87
ThreadTest.run88
ThreadTest.run89
ThreadTest.run90
ThreadTest.run91
ThreadTest.run92
ThreadTest.run93
ThreadTest.run94
ThreadTest.run95
ThreadTest.run96
ThreadTest.run97
ThreadTest.run98
ThreadTest.run99
ThreadTest.run100
ThreadTest.run101
ThreadTest.run102
ThreadTest.run103
ThreadTest.run104
ThreadTest.run105
ThreadTest.run106
ThreadTest.run107
ThreadTest.run108
ThreadTest.run109
ThreadTest.run110
ThreadTest.run111
ThreadTest.run112
ThreadTest.run113
ThreadTest.run114
ThreadTest.run115
ThreadTest.run116
ThreadTest.run117
ThreadTest.run118
ThreadTest.run119
ThreadTest.run120
ThreadTest.run121
ThreadTest.run122
ThreadTest.run123
ThreadTest.run124
ThreadTest.run125
ThreadTest.run126
ThreadTest.run127
ThreadTest.run128
ThreadTest.run129
ThreadTest.run130
ThreadTest.run131
ThreadTest.run132
ThreadTest.run133
ThreadTest.run134
ThreadTest.run135
ThreadTest.run136
ThreadTest.run137
ThreadTest.run138
ThreadTest.run139
ThreadTest.run140
ThreadTest.run141
ThreadTest.run142
ThreadTest.run143
ThreadTest.run144
ThreadTest.run145
ThreadTest.run146
ThreadTest.run147
ThreadTest.run148
ThreadTest.run149
ThreadTest.run150
ThreadTest.run151
ThreadTest.run152
ThreadTest.run153
ThreadTest.run154
ThreadTest.run155
ThreadTest.run156
ThreadTest.run157
ThreadTest.run158
ThreadTest.run159
ThreadTest.run160
ThreadTest.run161
ThreadTest.run162
ThreadTest.run163
ThreadTest.run164
ThreadTest.run165
ThreadTest.run166
ThreadTest.run167
ThreadTest.run168
ThreadTest.run169
ThreadTest.run170
ThreadTest.run171
ThreadTest.run172
ThreadTest.run173
ThreadTest.run174
ThreadTest.run175
ThreadTest.run176
ThreadTest.run177
ThreadTest.run178
ThreadTest.run179
ThreadTest.run180
ThreadTest.run181
ThreadTest.run182
ThreadTest.run183
ThreadTest.run184
ThreadTest.run185
ThreadTest.run186
ThreadTest.run187
ThreadTest.run188
ThreadTest.run189
ThreadTest.run190
ThreadTest.run191
TestJoin
ThreadTest.run192
ThreadTest.run193
ThreadTest.run194
ThreadTest.run195
ThreadTest.run196
ThreadTest.run197
ThreadTest.run198
ThreadTest.run199
ThreadTest.run200
ThreadTest.run201
ThreadTest.run202
ThreadTest.run203
ThreadTest.run204
ThreadTest.run205
ThreadTest.run206
ThreadTest.run207
ThreadTest.run208
ThreadTest.run209
ThreadTest.run210
ThreadTest.run211
ThreadTest.run212
ThreadTest.run213
ThreadTest.run214
ThreadTest.run215
ThreadTest.run216
ThreadTest.run217
ThreadTest.run218
ThreadTest.run219
ThreadTest.run220
ThreadTest.run221
ThreadTest.run222
ThreadTest.run223
ThreadTest.run224
ThreadTest.run225
ThreadTest.run226
ThreadTest.run227
ThreadTest.run228
ThreadTest.run229
ThreadTest.run230
ThreadTest.run231
ThreadTest.run232
ThreadTest.run233
ThreadTest.run234
ThreadTest.run235
ThreadTest.run236
ThreadTest.run237
ThreadTest.run238
ThreadTest.run239
ThreadTest.run240
ThreadTest.run241
ThreadTest.run242
ThreadTest.run243
ThreadTest.run244
ThreadTest.run245
ThreadTest.run246
ThreadTest.run247
ThreadTest.run248
ThreadTest.run249
ThreadTest.run250
ThreadTest.run251
ThreadTest.run252
ThreadTest.run253
ThreadTest.run254
ThreadTest.run255
ThreadTest.run256
ThreadTest.run257
ThreadTest.run258



发现TestJoin在

ThreadTest.run191
TestJoin
ThreadTest.run192



但是结果也没有400个ThreadTest.run,那怎么办?要么修改sleep的时间,不断调试,修改到一个合适的时间,但是这是不太可能的,此时就要用到join。

现在测试testJoin3,结果:

ThreadTest.run0
ThreadTest.run1
ThreadTest.run2
ThreadTest.run3
ThreadTest.run4
ThreadTest.run5
ThreadTest.run6
ThreadTest.run7
ThreadTest.run8
ThreadTest.run9
ThreadTest.run10
ThreadTest.run11
ThreadTest.run12
ThreadTest.run13
ThreadTest.run14
ThreadTest.run15
ThreadTest.run16
ThreadTest.run17
ThreadTest.run18
ThreadTest.run19
ThreadTest.run20
ThreadTest.run21
ThreadTest.run22
ThreadTest.run23
ThreadTest.run24
ThreadTest.run25
ThreadTest.run26
ThreadTest.run27
ThreadTest.run28
ThreadTest.run29
ThreadTest.run30
ThreadTest.run31
ThreadTest.run32
ThreadTest.run33
ThreadTest.run34
ThreadTest.run35
ThreadTest.run36
ThreadTest.run37
ThreadTest.run38
ThreadTest.run39
ThreadTest.run40
ThreadTest.run41
ThreadTest.run42
ThreadTest.run43
ThreadTest.run44
ThreadTest.run45
ThreadTest.run46
ThreadTest.run47
ThreadTest.run48
ThreadTest.run49
ThreadTest.run50
ThreadTest.run51
ThreadTest.run52
ThreadTest.run53
ThreadTest.run54
ThreadTest.run55
ThreadTest.run56
ThreadTest.run57
ThreadTest.run58
ThreadTest.run59
ThreadTest.run60
ThreadTest.run61
ThreadTest.run62
ThreadTest.run63
ThreadTest.run64
ThreadTest.run65
ThreadTest.run66
ThreadTest.run67
ThreadTest.run68
ThreadTest.run69
ThreadTest.run70
ThreadTest.run71
ThreadTest.run72
ThreadTest.run73
ThreadTest.run74
ThreadTest.run75
ThreadTest.run76
ThreadTest.run77
ThreadTest.run78
ThreadTest.run79
ThreadTest.run80
ThreadTest.run81
ThreadTest.run82
ThreadTest.run83
ThreadTest.run84
ThreadTest.run85
ThreadTest.run86
ThreadTest.run87
ThreadTest.run88
ThreadTest.run89
ThreadTest.run90
ThreadTest.run91
ThreadTest.run92
ThreadTest.run93
ThreadTest.run94
ThreadTest.run95
ThreadTest.run96
ThreadTest.run97
ThreadTest.run98
ThreadTest.run99
ThreadTest.run100
ThreadTest.run101
ThreadTest.run102
ThreadTest.run103
ThreadTest.run104
ThreadTest.run105
ThreadTest.run106
ThreadTest.run107
ThreadTest.run108
ThreadTest.run109
ThreadTest.run110
ThreadTest.run111
ThreadTest.run112
ThreadTest.run113
ThreadTest.run114
ThreadTest.run115
ThreadTest.run116
ThreadTest.run117
ThreadTest.run118
ThreadTest.run119
ThreadTest.run120
ThreadTest.run121
ThreadTest.run122
ThreadTest.run123
ThreadTest.run124
ThreadTest.run125
ThreadTest.run126
ThreadTest.run127
ThreadTest.run128
ThreadTest.run129
ThreadTest.run130
ThreadTest.run131
ThreadTest.run132
ThreadTest.run133
ThreadTest.run134
ThreadTest.run135
ThreadTest.run136
ThreadTest.run137
ThreadTest.run138
ThreadTest.run139
ThreadTest.run140
ThreadTest.run141
ThreadTest.run142
ThreadTest.run143
ThreadTest.run144
ThreadTest.run145
ThreadTest.run146
ThreadTest.run147
ThreadTest.run148
ThreadTest.run149
ThreadTest.run150
ThreadTest.run151
ThreadTest.run152
ThreadTest.run153
ThreadTest.run154
ThreadTest.run155
ThreadTest.run156
ThreadTest.run157
ThreadTest.run158
ThreadTest.run159
ThreadTest.run160
ThreadTest.run161
ThreadTest.run162
ThreadTest.run163
ThreadTest.run164
ThreadTest.run165
ThreadTest.run166
ThreadTest.run167
ThreadTest.run168
ThreadTest.run169
ThreadTest.run170
ThreadTest.run171
ThreadTest.run172
ThreadTest.run173
ThreadTest.run174
ThreadTest.run175
ThreadTest.run176
ThreadTest.run177
ThreadTest.run178
ThreadTest.run179
ThreadTest.run180
ThreadTest.run181
ThreadTest.run182
ThreadTest.run183
ThreadTest.run184
ThreadTest.run185
ThreadTest.run186
ThreadTest.run187
ThreadTest.run188
ThreadTest.run189
ThreadTest.run190
ThreadTest.run191
ThreadTest.run192
ThreadTest.run193
ThreadTest.run194
ThreadTest.run195
ThreadTest.run196
ThreadTest.run197
ThreadTest.run198
ThreadTest.run199
ThreadTest.run200
ThreadTest.run201
ThreadTest.run202
ThreadTest.run203
ThreadTest.run204
ThreadTest.run205
ThreadTest.run206
ThreadTest.run207
ThreadTest.run208
ThreadTest.run209
ThreadTest.run210
ThreadTest.run211
ThreadTest.run212
ThreadTest.run213
ThreadTest.run214
ThreadTest.run215
ThreadTest.run216
ThreadTest.run217
ThreadTest.run218
ThreadTest.run219
ThreadTest.run220
ThreadTest.run221
ThreadTest.run222
ThreadTest.run223
ThreadTest.run224
ThreadTest.run225
ThreadTest.run226
ThreadTest.run227
ThreadTest.run228
ThreadTest.run229
ThreadTest.run230
ThreadTest.run231
ThreadTest.run232
ThreadTest.run233
ThreadTest.run234
ThreadTest.run235
ThreadTest.run236
ThreadTest.run237
ThreadTest.run238
ThreadTest.run239
ThreadTest.run240
ThreadTest.run241
ThreadTest.run242
ThreadTest.run243
ThreadTest.run244
ThreadTest.run245
ThreadTest.run246
ThreadTest.run247
ThreadTest.run248
ThreadTest.run249
ThreadTest.run250
ThreadTest.run251
ThreadTest.run252
ThreadTest.run253
ThreadTest.run254
ThreadTest.run255
ThreadTest.run256
ThreadTest.run257
ThreadTest.run258
ThreadTest.run259
ThreadTest.run260
ThreadTest.run261
ThreadTest.run262
ThreadTest.run263
ThreadTest.run264
ThreadTest.run265
ThreadTest.run266
ThreadTest.run267
ThreadTest.run268
ThreadTest.run269
ThreadTest.run270
ThreadTest.run271
ThreadTest.run272
ThreadTest.run273
ThreadTest.run274
ThreadTest.run275
ThreadTest.run276
ThreadTest.run277
ThreadTest.run278
ThreadTest.run279
ThreadTest.run280
ThreadTest.run281
ThreadTest.run282
ThreadTest.run283
ThreadTest.run284
ThreadTest.run285
ThreadTest.run286
ThreadTest.run287
ThreadTest.run288
ThreadTest.run289
ThreadTest.run290
ThreadTest.run291
ThreadTest.run292
ThreadTest.run293
ThreadTest.run294
ThreadTest.run295
ThreadTest.run296
ThreadTest.run297
ThreadTest.run298
ThreadTest.run299
ThreadTest.run300
ThreadTest.run301
ThreadTest.run302
ThreadTest.run303
ThreadTest.run304
ThreadTest.run305
ThreadTest.run306
ThreadTest.run307
ThreadTest.run308
ThreadTest.run309
ThreadTest.run310
ThreadTest.run311
ThreadTest.run312
ThreadTest.run313
ThreadTest.run314
ThreadTest.run315
ThreadTest.run316
ThreadTest.run317
ThreadTest.run318
ThreadTest.run319
ThreadTest.run320
ThreadTest.run321
ThreadTest.run322
ThreadTest.run323
ThreadTest.run324
ThreadTest.run325
ThreadTest.run326
ThreadTest.run327
ThreadTest.run328
ThreadTest.run329
ThreadTest.run330
ThreadTest.run331
ThreadTest.run332
ThreadTest.run333
ThreadTest.run334
ThreadTest.run335
ThreadTest.run336
ThreadTest.run337
ThreadTest.run338
ThreadTest.run339
ThreadTest.run340
ThreadTest.run341
ThreadTest.run342
ThreadTest.run343
ThreadTest.run344
ThreadTest.run345
ThreadTest.run346
ThreadTest.run347
ThreadTest.run348
ThreadTest.run349
ThreadTest.run350
ThreadTest.run351
ThreadTest.run352
ThreadTest.run353
ThreadTest.run354
ThreadTest.run355
ThreadTest.run356
ThreadTest.run357
ThreadTest.run358
ThreadTest.run359
ThreadTest.run360
ThreadTest.run361
ThreadTest.run362
ThreadTest.run363
ThreadTest.run364
ThreadTest.run365
ThreadTest.run366
ThreadTest.run367
ThreadTest.run368
ThreadTest.run369
ThreadTest.run370
ThreadTest.run371
ThreadTest.run372
ThreadTest.run373
ThreadTest.run374
ThreadTest.run375
ThreadTest.run376
ThreadTest.run377
ThreadTest.run378
ThreadTest.run379
ThreadTest.run380
ThreadTest.run381
ThreadTest.run382
ThreadTest.run383
ThreadTest.run384
ThreadTest.run385
ThreadTest.run386
ThreadTest.run387
ThreadTest.run388
ThreadTest.run389
ThreadTest.run390
ThreadTest.run391
ThreadTest.run392
ThreadTest.run393
ThreadTest.run394
ThreadTest.run395
ThreadTest.run396
ThreadTest.run397
ThreadTest.run398
ThreadTest.run399
TestJoin



看,先输出400个ThreadTest.run,然后再输出TestJoin。

testJoin3里共有两个线程,第一个是主线程,第二个就是ThreadTest这个线程了,join的作用就是等ThreadTest这个线程运行到die了,主线程再运行。