java多线程编程入门


package com.CUPK.lsz;

public class TraditionalThread {

	public static void main(String[] args) {
		/*
		 * 方法一:
		 */
		// 定义一个子类对象
		Thread thread0 = new Thread() {
			public void run() {
				while (true) {
					try {
						Thread.sleep(5000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out.println("0当前线程为:" + Thread.currentThread().getName());
					System.out.println("1当前线程为:" + this.getName());
				}
			}
		};
		// thread0.start();

		/* 方法二 */
		Thread thread1 = new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					// TODO Auto-generated method stub
					System.out.println("当前线程为:" + Thread.currentThread().getName());
				}
			}

		});
		// thread1.start();

		/* 深入理解run()方法 */
		//首先start()方法去找当前对象Thread,并执行当前对象的run()方法,如果没找到子类的run()方法,才会去找父类的run()方法,在Runnable对象不为null时,父类run()方法会去找Runnable的run()方法,而当前子类有run()方法,所以会执行子类的run()方法
		//建立Thread类的子对象,并重run()方法,这个时候子类的run()方法已经重写了父类的run()方法
		new Thread(new Runnable() {

			@Override
			public void run() {
				System.out.println("Runnable run" + Thread.currentThread().getName());

			}

		}) {

			@Override
			public void run() {
				while (true) {
					System.out.println("Thread run" + Thread.currentThread().getName());
				}
			}
		}.start();
	}

}
//如果我们将Thread类的子对象中的run()方法去掉,则会调用父类run()方法,有因为Runnable对象不为null,所以进而调用Runnable的run()方法

这里我们重点说一下方法二 :

首先我们看一下Thread类的源代码:

由上面图片可以看出1、在Thread类中定义了Runnable类的target对象

2、在Thread的构造方法public Thread(Runnable target)中调用了init()方法

3.private void init(ThreadGroup g, Runnable target, String name,
                      long stackSize, AccessControlContext acc) 方法中

this.target=target语句将类中的target对象赋值

4.类中的run(){}方法有如下语句:if(targit!=null){target.run();}说明如果类中的target对象不为null,则调用target对象的run()方法,

所以我们将Runnable类创建的target子对象传给Thread()类,并在其中实现target子对象的run()方法。

猜你喜欢

转载自blog.csdn.net/qq_40301016/article/details/81739195
今日推荐