• Java并发基础--Thread类


    一、Thread类的构成

    Thread类实现Runnable接口。部分源码如下:

    二、Thread类常用方法

    1.currentThread()方法

    currentThread()方法可以返回代码段正在被哪个线程调用的信息,使用如下:

     1 public class MyThread implements Runnable{
     2 
     3     @Override
     4     public void run() {
     5         System.out.println(Thread.currentThread().getName());
     6     }
     7     public static void main(String[] args) {
     8         
     9         //new Thread(new MyThread()).start();
    10         new MyThread().run();
    11         System.out.println(Thread.currentThread().getName());
    12     }
    13 }

    结果输出:

    main
    main
     1 public class MyThread implements Runnable{
     2 
     3     @Override
     4     public void run() {
     5         System.out.println(Thread.currentThread().getName());
     6     }
     7     public static void main(String[] args) {
     8         
     9         new Thread(new MyThread()).start();
    10         //new MyThread().run();
    11         System.out.println(Thread.currentThread().getName());
    12     }
    13 }

    结果输出:

    main
    Thread-0

    2.isAlive()方法

    isAlive()方法主要是判断当前线程是否处于活动状态(线程已经启动且尚未终止),使用如下:

     1 public class MyThread2 implements Runnable{
     2 
     3     @Override
     4     public void run() {
     5         System.out.println(Thread.currentThread().getName()+" is alive:"+Thread.currentThread().isAlive());
     6     }
     7     public static void main(String[] args) {
     8         
     9         Thread thread = new Thread(new MyThread2());
    10         thread.start();
    11         System.out.println(Thread.currentThread().getName());
    12         System.out.println("main is alive:"+Thread.currentThread().isAlive());
    13         System.out.println("thread-0 is alive2:"+thread.isAlive());//可能为false,也可能为true,如果run先执行,打印false,否则true
    14         
    15     }
    16 }

    结果输出:

    main
    main is alive:true
    thread-0 is alive2:true
    Thread-0 is alive:true
    
    或者
    main
    Thread-0 is alive:true
    main is alive:true
    thread-0 is alive2:false

    3.sleep()方法

    sleep方法的作用主要是在指定毫秒数内让当前正在执行的线程休眠,暂停执行。特别需要注意的一点,sleep让出CPU,让CPU去执行其他任务,但是当前线程如果持有某个对象的锁,它不会释放锁。

     1 public class MyThread2 implements Runnable{
     2     @Override
     3     public void run() {
     4         
     5     }
     6     public static void main(String[] args) {
     7         System.out.println(new Date());
     8         try {
     9             Thread.sleep(3000);
    10         } catch (InterruptedException e) {
    11             e.printStackTrace();
    12         }
    13         System.out.println(new Date());
    14     }
    15 
    16 }

    结果输出:

    Mon Jul 16 21:10:27 CST 2018
    Mon Jul 16 21:10:30 CST 2018

    4.yield()方法

    yield()方法主要作用是让当前线程交出CPU权限,让CPU去执行其他的线程。它跟sleep方法类似,同样不会释放锁。但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。需要注意的是yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,这一点是和sleep方法不一样的。

    5.join()方法

    如果在main方法执行代表某个线程的的thread类的join方法,则main方法会等待thread线程执行完毕或者等待一定的时间。如果调用的是无参join方法,则等待thread执行完毕,如果调用的是指定了时间参数的join方法,则等待一定的时间后如果线程任务还未完成,则不在等待。

     1 public class MyThread2 implements Runnable{
     2 
     3     @Override
     4     public void run() {
     5         System.out.println(Thread.currentThread().getName()+" is finish");
     6     }
     7     
     8     public static void main(String[] args) {
     9         Thread t = new Thread(new MyThread2());
    10         t.start();
    11         try {
    12             t.join();
    13         } catch (InterruptedException e) {
    14             e.printStackTrace();
    15         }
    16         System.out.println(Thread.currentThread().getName()+" is finish");
    17     }
    18 
    19 }

    结果输出:

    Thread-0 is finish
    main is finish

    6.interrupt方法

    interrupt方法不能中断正在运行中的线程。可以中断超时等待中的线程,如sleep状态下的线程,如下:

     1 public class MyThread3 implements Runnable{
     2 
     3     @Override
     4     public void run() {
     5         try {
     6             Thread.sleep(30000);
     7         } catch (InterruptedException e) {
     8             System.out.println(Thread.currentThread().getName()+" is interrupted");
     9             e.printStackTrace();
    10         }
    11         System.out.println(Thread.currentThread().getName()+" is finish");
    12     }
    13     
    14     public static void main(String[] args) {
    15         Thread t = new Thread(new MyThread3());
    16         t.start();
    17         t.interrupt();
    18         System.out.println(t.getName()+" is isInterrupted?: "+t.isInterrupted());
    19         System.out.println(Thread.currentThread().getName()+" is finish");
    20     }
    21 
    22 }

    结果输出:

    Thread-0is isInterrupted?: true
    Thread-0is interrupted
    main is finish
    java.lang.InterruptedException: sleep interrupted
        at java.lang.Thread.sleep(Native Method)
        at com.sun.lp.demo.MyThread2.run(MyThread2.java:10)
        at java.lang.Thread.run(Thread.java:748)
    Thread-0 is finish

    7.stop()方法

    目前已经废弃,它是一个不安全的方法。因为调用stop方法会直接终止run方法的调用,并且会抛出一个ThreadDeath错误。不过多的讨论

    8.getName()、setName()和getId()

    获取和设置线程的名称。获取线程的ID

    9.setDaemon()和isDaemon()

    设置线程为守护线程和判断是否是守护线程

    守护线程:一种特殊的线程,有陪伴的含义,当进程中不存在非守护线程的时候,则守护线程自动销毁,典型的守护线程是垃圾回收线程。守护线程的作用主要是为其他线程的运行提供便利服务。

    10.start()方法

    start()用来启动一个线程,当调用start方法后,系统才会开启一个新的线程来执行用户定义的子任务,在这个过程中,会为相应的线程分配需要的资源

    11.run()方法

    run()方法是不需要用户来调用的,当通过start方法启动一个线程之后,当线程获得了CPU执行时间,便进入run方法体去执行具体的任务。注意,继承Thread类必须重写run方法,在run方法中定义具体要执行的任务。

  • 相关阅读:
    idea 常用功能
    405 跨域问题的解决
    哪些情况会报 404
    [LeetCode]题解(python):077-Combinations
    [LeetCode]题解(python):076-Minimum Window Substring
    [LeetCode]题解(python):075-Sort Colors
    [LeetCode]题解(python):074-Search a 2D Matrix
    [LeetCode]题解(python):073-Set Matrix Zeroes
    [LeetCode]题解(python):072-Edit Distance
    [LeetCode]题解(python):071-Simplify Path
  • 原文地址:https://www.cnblogs.com/liupiao/p/9320694.html
Copyright © 2020-2023  润新知