Java SE 099 Thread类源代码深度剖析

(1)一个人只要自己不放弃自己,整个世界也不会放弃你.
(2)天生我才必有大用
(3)不能忍受学习之苦就一定要忍受生活之苦,这是多么痛苦而深刻的领悟.
(4)做难事必有所得
(5)精神乃真正的刀锋
(6)战胜对手有两次,第一次在内心中.
(7)编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~

Java SE 099 Thread类源代码深度剖析

1.通过实现Runnable接口实现线程

在这里插入图片描述
(1)实现Runnable接口的类实现run方法。

(2)通过建立一个实现了Runnable接口的类,并以它作为线程的目标对象来创建一个线程。

(3)Runnable接口:定义了一个抽象方法run()。定义如下

@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

1.1通过实现Runnable接口类定义线程类

package com.javareview.thread.runnable;

/**
 * 通过实现Runnable接口的方式定义线程类
 */
public class RunnableThread implements Runnable {
	@Override
	public void run() {
		for(int i = 0; i < 100 ; i++){
			System.out.println("hello world: " +i);
		}
	}
}

1.2实现Runnable接口的线程类的使用

package com.javareview.thread.test;

import com.javareview.thread.runnable.RunnableThread;

/**
 * 实现Runnable接口的线程类的使用
 */
public class RunnableThreadTest {
	public static void main(String[] args) {
		//s1.创建线程并启动
		Thread t1 = new Thread(new RunnableThread());
		//s2.启动线程
		t1.start();
	}
}

1.3使用匿名内部类的方式定义线程类

package com.javareview.thread.test;
/**
 * 匿名内部类的方式定义线程
 */
public class RunnableThreadTest2 {
	public static void main(String[] args) {
		Thread t1 = new Thread(new Runnable(){
			@Override
			public void run() {
				for(int i = 0; i < 100 ; i++){
					System.out.println("hello world: " +i);
				}
			}
		});
		t1.start();
	}
}

1.4实现Runnable接口的方式定义线程类2

package com.javareview.thread.runnable;

public class RunnableThread2 implements Runnable {
	@Override
	public void run() {
		for(int i = 0; i < 100 ; i++){
			System.out.println("welcome : " +i);
		}
	}
}

1.5测试线程类的使用

package com.javareview.thread.test;

import com.javareview.thread.runnable.RunnableThread;
import com.javareview.thread.runnable.RunnableThread2;

public class RunnableThread2Test {
	public static void main(String[] args) {
		// s1.创建线程并启动
		Thread t1 = new Thread(new RunnableThread());
		// s2.启动线程
		t1.start();
		Thread t2 = new Thread(new RunnableThread2());
		t2.start();
	}
}

2.继承Thread类与实现Runnable接口这两种实现线程的方式它们的关系是什么?

(1)Thread类实现了Runnable接口,因此也实现了Runnable接口中的run()方法。

(2)当生成一个线程对象时,如果没有为其设定名字,那么线程对象的名字将使用如下形式:Thread-number,该number将是自动增加的,并被所有的Thread对象所共享(因为它是static的成员变量)。

(3)当使用继承Thread类的方式生成线程对象时,我们需要重写run()方法,因为Thread类的run方法此时什么事情也不做。(看Thread类的源代码)

(4)当使用实现Runnable接口的方式生成线程对象时,我们需要实现Runnable接口的run方法,然后使用new Thread(new MyThread())(RunnableThread类实现了Runnable接口)来生成线程对象,这时线程对象的run方法就会调用RunnableThread类的run方法,这样我们编写的run方法就执行了。

3.总结

在这里插入图片描述

(1)两种方法均需执行线程的start方法为线程分配必须的系统资源、调度线程运行并执行线程的run方法。

(2)在具体应用中,采用哪种方法来构造线程体要视情况而定。通常,当一个线程已继承了另一个类时,就应该用第二种方法来构造,即实现Runnable接口。

(3)线程的消亡不能通过学习调用一个stop()命令,而是让run()方法自然结束。

3.1停止线程推荐的方式

3.1.1定义线程类
package com.javareview.thread.stopthread;

/**
 * 结束一个线程推荐的方式
 */
public class StopThread implements Runnable {
	//s1.定义一个线程结束的标志
	private boolean flag = true;
	
	@Override
	public void run() {
		while(flag) {
			System.out.println("hello");
		}
	}
	
	//s2.提供一个公用的方法供外部程序调用,停止当前线程
	public void stopRunning() {
		flag = false;
	}
}
3.1.2定义线程控制类
package com.javareview.thread.stopthread;

/**
 * 定义线程控制类
 */
public class ControlThread {
	// s1.生成线程类对象
	private StopThread r = new StopThread();

	// s2.构建线程对象
	private Thread t = new Thread(r);

	// s3.启动线程
	public void startThread() {
		t.start();
	}

	// s4.停止线程
	public void stopThread() {
		r.stopRunning();
	}
}
3.1.3测试线程控制类
package com.javareview.thread.stopthread.test;

import com.javareview.thread.stopthread.ControlThread;

public class ControlThreadTest {
	public static void main(String[] args) throws InterruptedException {
		//s1.启动线程
		ControlThread control = new ControlThread();
		control.startThread();
		
		Thread.sleep(3);
		//s2.结束线程
		control.stopThread();
	}
}

4.线程具有哪些特性?

(1)线程的特性很大程度上来源于它的不确定性,线程一般启动之后,我们再也没有办法去控制它了。

(2)要想让线程按照我们的想法去执行,必须要给它设定一些规则。比如到某些地方,该做什么事情,这些规则必须提前设定好,提前设定好这些规则之后,接下来,线程才会按照我们预期的方式去执行,否则就会乱序了。

5.停止线程推荐的方式

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风百草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值