java线程学习一

        对于线程,最先接触的两个构建方法就是Thread 和Runnable了,下边是代码:

         

public class ThreadTest {
	public static void main(String[] args){
		Thread t1 = new MyThread1(1);
		Thread t2 = new Thread(new MyThread2(2));
		t1.start();
		t2.start();
                for(int i=0; i<10; i++){
			System.out.println("主程序第"+i+"次打印");
		}
	}
}
class MyThread1 extends Thread{
	int i = 0;
	public MyThread1(int i){
		this.i = i;
	}
	public void run(){
		for(int j = 0; j < 10; j++){
			System.out.println("线程"+i+"第"+j+"次打印");
		}
	}
}

class MyThread2 implements Runnable {
	int i = 0;
	public MyThread2(int i){
		this.i = i;
	}
	public void run(){
		for(int j = 0; j < 10; j++){
			System.out.println("线程"+i+"第"+j+"次打印");
		}
	}
}
主程序第0次打印
主程序第1次打印
线程1第0次打印
主程序第2次打印
线程1第1次打印
主程序第3次打印
线程1第2次打印
主程序第4次打印
线程1第3次打印
主程序第5次打印
线程1第4次打印
主程序第6次打印
线程1第5次打印
主程序第7次打印
线程1第6次打印
主程序第8次打印
线程1第7次打印
主程序第9次打印
线程1第8次打印
线程1第9次打印
线程2第0次打印
线程2第1次打印
线程2第2次打印
线程2第3次打印
线程2第4次打印
线程2第5次打印
线程2第6次打印
线程2第7次打印
线程2第8次打印
线程2第9次打印

 可以看到,杂乱无章的结果,说明线程各自为政,包括主线程。其实主线程main也是jvm的一个线程,t1和t2相当于在主线程内新开的两个线程。

适当修改主函数

Thread t1 = new MyThread1(1);
		Thread t2 = new Thread(new MyThread2(2));
		for(int i=0; i<1000; i++){
			System.out.println("主程序第"+i+"次打印");
		}
		t1.start();
		t2.start();

 可以看到t1和t2的结果是在主程序之后才会打印,这说明在单个线程内,代码的执行顺序是自上而下的。

       当我们需要某个线程要在另一个线程执行结束之后才能执行,就需要用到join方法了。他是线程类的一个实例化方法。   我们适当修改主函数

Thread t1 = new MyThread1(1);
		Thread t2 = new Thread(new MyThread2(2));
		t1.start();
		t2.start();
		try {
			t1.join();
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

 此时,为了效果明显,可以在打印语句上加上sleep函数,如

System.out.println("主程序第" + i + "次打印");

			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

 执行结果如下:

线程1第0次打印
线程2第0次打印
线程1第1次打印
线程2第1次打印
线程1第2次打印
线程2第2次打印
线程1第3次打印
线程2第3次打印
线程1第4次打印
线程2第4次打印
线程1第5次打印
线程2第5次打印
线程1第6次打印
线程2第6次打印
线程1第7次打印
线程2第7次打印
线程2第8次打印
线程1第8次打印
线程1第9次打印
线程2第9次打印
主程序第0次打印
主程序第1次打印
主程序第2次打印
主程序第3次打印
主程序第4次打印
主程序第5次打印
主程序第6次打印
主程序第7次打印
主程序第8次打印
主程序第9次打印

 可以看到,线程1和线程2的执行顺序是杂乱的,但是主程序是最后才会执行。实际上。join方法是令调用该线程的线程等待该线程执行完毕。。   在这个例子里面就是,让main线程等待t1线程执行完毕。

     再修改一下主函数:

Thread t1 = new MyThread1(1);
		Thread t2 = new Thread(new MyThread2(2));
		t1.start();
		t2.start();
		for(int i=0; i<10; i++){
			System.out.println("主程序第"+i+"次打印");
			
			try {
				if(i == 5){
					t1.join();
				}
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

     调用结果:

主程序第0次打印
线程2第0次打印
线程1第0次打印
线程1第1次打印
主程序第1次打印
线程2第1次打印
线程1第2次打印
线程2第2次打印
主程序第2次打印
主程序第3次打印
线程2第3次打印
线程1第3次打印
线程2第4次打印
线程1第4次打印
主程序第4次打印
主程序第5次打印
线程2第5次打印
线程1第5次打印
线程2第6次打印
线程1第6次打印
线程1第7次打印
线程2第7次打印
线程1第8次打印
线程2第8次打印
线程2第9次打印
线程1第9次打印
主程序第6次打印
主程序第7次打印
主程序第8次打印
主程序第9次打印

     可以发现,当主函数打印出5之前,三个线程是杂乱无章的执行顺序。但是当主线程调用了线程t1的join方法之后,主函数就停住了(这是join方法最主要的特点),等t1执行完毕以后才会继续执行主线程。

     在jdk1.5之后,java对线程的操作增加了可返回值的线程。这个想想确实挺兴奋的,但是用的不多,明天更新。个人觉得他最主要的用法可能是当多个线程执行同一效果的时候,可以多线程并用,如果有一个线程成功就可以停掉其他线程。比如说现在有5台打印机,那么我让5个线程分别操作这5台打印机,打印一样的东西。当有一个线程打印成功了,那么就停掉其他线程。

猜你喜欢

转载自709002341.iteye.com/blog/2252562