基础概念
线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。
每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新
Thread
对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的
main
方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止:
- 调用了
Runtime
**类的exit
方法,并且安全管理器允许退出操作发生。- 非守护线程的所有线程都已停止运行,无论是通过从对 run 方法的调用中返回,还是通过抛出一个传播到
run
方法之外的异常。创建新执行线程有两种方法。一种方法是将 类声明为
Thread
的子类。该子类应重写Thread
类的run
方法。创建线程的另一种方法是声明实现Runnable
接口的类。该类然后实现run
方法。然后可以分配该类的实例,在创建Thread
时作为一个参数来传递并启动。 -------来源于JDK1.6API
1.java.lang.Thread类的方法
✔Thread类的构造方法
✔Thread类的常用方法
2.Thread类的构造方法
①public Thread() :分配一个新的线程对象。
②public Thread(String name) :分配一个指定名字的新的线程对象。
③public Thread(Runnable target) :分配一个带有指定目标新的线程对象。
④public Thread(Runnable target,String name) :分配一个带有指定目标新的线程对象并指定名字。
3.Thread类的常用方法
①public void run() :此线程要执行的任务在此处定义代码。
②public String getName() :获取当前线程名称。/public String setName() :设置当前线程名称。
③public static Thread currentThread() :返回对当前正在执行的线程对象的引用。
④public final boolean isAlive():测试线程是否处于活动状态。如果线程已经启动且尚未终止,则为活动状态。
⑤public final int getPriority() :返回线程优先级 。
⑥public final void setPriority(int newPriority) :改变线程的优先级。
通常推荐设置Thread类的三个优先级常量:
☞MAX_PRIORITY(10):最高优先级 。
☞MIN _PRIORITY (1):最低优先级。
☞NORM_PRIORITY (5):普通优先级,默认情况下main线程具有普通优先级。
⑦public void start() :导致此线程开始执行; Java虚拟机调用此线程的run方法。
⑧public static void sleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。
⑨public static void yield():yield只是让当前线程暂停一下,让系统的线程调度器重新调度一次,希望优先级与当前线程相同或更高的其他线程能够获得执行机会,但是这个不能保证,完全有可能的情况是,当某个线程调用了yield方法暂停之后,线程调度器又将其调度出来重新执行。【加塞】
⑩void join() :等待该线程终止。
void join(long millis) :等待该线程终止的时间最长为 millis 毫秒。如果millis时间到,将不再等待。
void join(long millis, int nanos) :等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。
⑪public final void stop():强迫线程停止执行。 该方法具有固有的不安全性,已经标记为@Deprecated不建议再使用,那么我们就需要通过其他方式来停止线程了,其中一种方式是使用变量的值的变化来控制线程是否结束。
4.代码演示
▲①如何给线程取名字?
☀继承Thread类方式获取当前线程名称
public class ThreadTest {
public static void main(String[] args) {
MyThread my1 = new MyThread();
//【知识点一】:public void start() :导致此线程开始执行; Java虚拟机调用此线程的run方法。
my1.start();
MyThread my2 = new MyThread("大侠半夜战斗线程");
my2.start();
}
}
class MyThread extends Thread {
public MyThread() {
super();
}
public MyThread(String name) {
super(name);
}
// 必须重写run()
@Override
public void run() {
//线程开始执行; Java虚拟机调用此线程的run方法。
//【知识点二】:public String getName() :获取当前线程名称。
System.out.println(getName());
}
}
打印结果:
Thread-0
大侠半夜战斗线程
☀实现Runnable接口方式获取当前线程名称
package com.daxia.case2;
public class RunnableTest {
public static void main(String[] args) {
// 【知识点一】(构造方法)public Thread(Runnable target) :分配一个带有指定目标新的线程对象。
Thread t1 = new Thread(new MyRunnable());
t1.start();
// 【知识点二】public Thread(Runnable target,String name)
// 分配一个带有指定目标新的线程对象并指定名字。
Thread t2 = new Thread(new MyRunnable(), "久而久之熊猫眼线程");
t2.start();
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
// 【知识点三】public static Thread currentThread() :返回对当前正在执行的线程对象的引用。
System.out.println(Thread.currentThread().getName());
}
}
打印结果:
Thread-0
久而久之熊猫眼线程
▲②如何判断线程是活的状态?
打印结果:
true
大侠半夜战斗线程
Thread-0
▲③如何判断和修改线程优先级?
◆优先级高的抢到CPU的概率高,但还是不能保证一定先执行,不能用业务逻辑的先后顺序依赖优先级。
打印结果:
主线程:main,优先级:10
自定义线程:大侠半夜战斗线程,优先级:3
▼注意如果优先级一定要在[1,10],否则会报错
▲④如何暂停当前线程(常用sleep())?
import org.junit.Test;
public class SleepTest {
@Test
public void test() throws InterruptedException{
for (int i = 10; i >=1; i--) {
System.out.println("倒计时:"+i);
Thread.sleep(1000);//模拟倒计时的场景,每秒的间隔
}
System.out.println("下班啦!");
}
}
打印结果:
倒计时:10
倒计时:9
倒计时:8
倒计时:7
倒计时:6
倒计时:5
倒计时:4
倒计时:3
倒计时:2
倒计时:1
下班啦!
▲⑤如何加塞线程?
(不限时)加塞后:
(限时)加塞后:
推荐阅读往期博文:
•JavaSE高级应用#多线程入门基础#继承Thread类和实现Runnable接口-启动线程
#轻松一刻
☝上述分享来源个人总结,如果分享对您有帮忙,希望您积极转载;如果您有不同的见解,希望您积极留言,让我们一起探讨,您的鼓励将是我前进道路上一份助力,非常感谢!我会不定时更新相关技术动态,同时我也会不断完善自己,提升技术,希望与君同成长同进步!
☞本人博客:https://coding0110lin.blog.youkuaiyun.com/ 欢迎转载,一起技术交流吧!