Join的讲解

发表时间:2017-09-07 16:37:30 浏览量( 11 ) 留言数( 0 )

学习目标:

1、了解Join的作用

2、能根据实际场景灵活使用Join


学习过程:

   方法Join的操作join和sleep完全不一样,join是使用wait实现的,所以具有释放锁的功能。下面我们看一下一个示例:

     定义一个二维数据,每一个线程把一行的数据乘以10,通过主线程打印出来。

   当然这个例子可能非常简单,但是你可以想象一下,如果一个很大的数组,单单使用一个线程可能要花很多时间计算,如果每一个线程只执行一行的数据计算,那么效率会高很多,但是问题时我如果执行所有的线程都计算完毕呢,这时候就可以使用Join操作了。实现代码逻辑如下:

定义一个线程,只操作一行的数据

public class ThreadJoin extends Thread{

	public int j;
	public int[][] array;

	public ThreadJoin(int j, int[][] array) {
		this.j = j;
		this.array = array;

	}

	public void run() {
       for(int i=0;i<3;i++) {
    	   array[i][j]*=10;
       }
	}

}

定义一个运行类:

public class RunJoin {

	public static void main(String[] args) throws InterruptedException {

		// 声明一个3X3的数组
		// 每一个线程操作一行,所有的线程都处理完毕后再把数组打印出来,如果没有所有的线程都处理完毕那么打印出来的当然也是有问题的。

		int[][] array = new int[3][3];

		int temp = 1;
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				array[i][j] = temp++;
			}
		}

		ThreadJoin threadJoin1 = new ThreadJoin(0, array);
		ThreadJoin threadJoin2 = new ThreadJoin(1, array);
		ThreadJoin threadJoin3 = new ThreadJoin(2, array);
		
		threadJoin1.start();
		threadJoin2.start();
		threadJoin3.start();
		
		
		//等待所有的线程计算完毕
		threadJoin1.join();
		threadJoin2.join();
		threadJoin3.join();
		

		//才会执行这一步操作
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				System.out.print(array[i][j] + ",");
			}
			System.out.println();

		}

	}

}


运行,结果如下,你也可以尝试一下不适用join的效果时怎么样的,打印的结果会很乱。

attcontent/fca37901-5c1e-4120-bafb-871c73d060ef.png

删除join的结果,思考一下为什么会这样,有些时错误乱的。

attcontent/7a0fb74c-e956-4a4a-b1db-90a74ffc7deb.png