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)

  1. List item
    如果线程非阻塞(无wait ,join,sleep),仅将线程状态置为interrupt而已,即将中断标志true,根据此状态进一步决定如何处理退出线程
  2. 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());

    }
}

运行结果如下图所示:

java线程提升 java线程用法_线程


run方法只是一个回调函数,如果仅调用run方法则执行run方法的线程不会是新建的线程,而若使用start方法,则执行run方法的线程会是刚刚启动的线程。