1·线程名称获取
取得JVM中正在执行的线程对象
public static native Thread currentThread();
线程名称的命名与取得
线程创建建议设置一个简明思意的名称(表示线程功能)
//两种方式
public Thread (Runnable target,String name){}
public Thread synchronized void setName (String name){}
获取当前线程Thread.currentThread()
获取线程名称thread.getName()
String getName( )
线程名称(未起名时系统默认):普通线程名称 thread-index,主线程名称:main
Java程序启动,创建JVM进程,创建main线程序外,还有其他线程,(比如垃圾回收线程)
在Java中,线程是最小的执行单元,JVM进程中线程不存在时,JVM进程退出
2· 线程休眠 sleep()方法
sleep(long time)单位为毫秒
Thread类的休眠方法
让当前线程暂缓执行一定的时间,当时间到了继续执行
让当前线程立即交出CPU,不释放对象锁,线程回到阻塞
3·线程让步 yield()方法
Thread类的休眠方法
暂停当前正在执行的线程对象,并执行其他线程。
当前线程不会交出CPU(想要获得该CPU权限必须和当前线程优先级相同),交出时间由系统调度。不释放对象锁,线程回到就绪
4·线程等待 join()方法
Thread类的成员方法,通过线程对象调用
如果在一个线程A中调用另外一个线程B的join方法(指定时间),那么这个线程A将休眠直到线程B的run方法执行完毕,线程A将继续执行(在哪个线程中调用,哪个线程阻塞,等待线程执行完毕再恢复执行)
5·线程停止
标记位法(常用)(无法处理线程阻塞时的停止问题)
线程对象的stop法(不建议使用,已经弃用)
强行关闭线程
stop会立即停止线程,容易导致同步失败问题,数据不完整等
中断
调用Thread类的interrupted方法
中断是信号,不会停止线程
调用interrupted方法,修改线程中断标志(ture)
- List item
如果线程非阻塞(无wait ,join,sleep),仅将线程状态置为interrupt而已,即将中断标志true,根据此状态进一步决定如何处理退出线程 - List item
如果线程是阻塞,先中断标志true,然后分析引起阻塞的原因是wait ,join,sleep中的哪一种,使中断标志还原为false(isInterrupted = false),抛出中断异常,
中断意义:让开发者跟进线程的中断标志来决定如何处理退出线程
6·线程优先级
Java中线程具有优先级,优先级越高的线程越有可能先执行
线程的优先级(0~10)
通过thread对象的setPriority(int v),getPriority()方法:用来修改和获取线程的优先级
main线程的优先级是5
JDK内置了三种优先级:
- MAX_PRIORITY =10;
- NORM_PRIORITY = 5;
- MIN_PRIORITY = 1;
线程的优先级具有继承性,比如:线程A的优先级是V,那么在线程A中创建的B线程,那么B和A的优先级将是一样的。
7· 守护线程 DaemonThread
创建线程默认就是用户线程,包括主线程
设置线程为守护线程需要调用setDaemon(ture),必须在start之前调用
java 中有两种线程:用户线程和守护线程。
守护线程用来守护用户线程,即伴随线程,通常守护线程业务是持续执行的代码
当JVM中最后一个用户线程退出,守护线程和JVM才一并退出,否则一直工作。
Thread对象创建默认是用户线程,如果要设置守护线程,必须在start之前调用setDaemon(ture)
典型守护线程:垃圾回收线程
8·线程start方法和run方法的区别
Java中创建线程不管是继承Thread的方式还是实现Runnable接口的方式都需要重写run方法,然后调用start方法创建一个新线程并启动。
public class Main {
public static void main(String[] args) {
Thread thread = new Thread(new newThread());
thread.run();
thread.start();
}
}
class newThread implements Runnable{
@Override
public void run() {
System.out.println("执行本方法的线程为:"+Thread.currentThread().getName());
}
}
运行结果如下图所示:
run方法只是一个回调函数,如果仅调用run方法则执行run方法的线程不会是新建的线程,而若使用start方法,则执行run方法的线程会是刚刚启动的线程。