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