Java线程相关方法

线程启动与执行相关

 start():启动一个新线程,在新的线程运行run方法中的代码;start 方法只是让线程进入就绪,里面代码不一定立刻运行(CPU 的时间片还没分给它)。每个线程对象的start方法只能调用一次,如果调用了多次会出现IllegalThreadStateException。
 run():新线程启动后会调用的方法;如果在构造 Thread 对象时传递了Runnable参数,则线程启动后会调用Runnable中的 run方法,否则默认不执行任何操作。但可以创建Thread 的子类对象,来覆盖默认行为。
  start()方法用于启动一个新线程,并让新线程去执行run()方法中的代码,实现多线程并发执行。因此,在需要创建多线程的场景中,应该使用start()方法来启动线程。

public class ThreadExample {
   public static void main(String[] args) {
       // 创建并启动一个新线程
       new Thread() {
           @Override
           public void run() {
               for (int i = 0; i < 5; i++) {
                   System.out.println("Thread based on Thread class: " + i);
                   try {
                       // 线程休眠 100 毫秒
                       Thread.sleep(100); 
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
           }
       }.start();

       // main 线程继续执行下面的代码
       for (int i = 0; i < 5; i++) {
           System.out.println("Main thread: " + i);
           try {
               // 线程休眠 100 毫秒
               Thread.sleep(100); 
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }
   }
}

 当调用 start() 方法启动新线程后,main线程会继续执行start()方法之后的代码(不会等待新线程的run()方法执行完毕),也就是后续的for循环;
 新启动的这个线程主要执行的就是匿名对象内部重写的run()方法里的代码逻辑。

线程状态控制与阻塞相关

sleep:
 调用sleep会让当前线程从Running进入TimedWaiting状态(超时等待)(阻塞),但不会释放对象锁
 其它线程可以使用interrupt方法打断正在睡眠的线程,这时sleep方法会抛出InterruptedException
 睡眠结束后的线程完毕会立刻得到执行
 建议用TimeUnit的sleep代替Thread的sleep来获得更好的可读性
 sleep当传入参数为0时,和yield相同
interrupt:
 中断线程,若被中断线程正在sleep,wait,join 会导致被中断的线程抛出InterruptedException,并清除中断标记(这些方法会停止) ;
 如果中断的正在运行的线程,则会设置中断标记;park 的线程被中断,也会设置中断标记;
 interrupted() 判断当前线程是否被中断 一旦被调用中断标记就会被清除
 isInterrupted():判断当前线程是否被中断,不清标记
yield:
 yield会释放CPU资源,让当前线程从 Running 进入 Runnable状态,让优先级更高(至少是相同)的线程获得执行机会,不会释放对象锁;(阻塞到就绪会有一个上下文切换)
 假设当前进程只有main线程,当调用yield之后,main线程会继续运行,因为没有比它优先级更高的线程;
 具体的实现依赖于操作系统的任务调度器

线程优先级相关

 setPriority():线程优先级会提示调度器优先调度该线程,但它仅仅是一个提示,调度器可以忽略它,默认优先级是5,优先级的范围从1~10;
 getPriority():获取线程优先级

线程同步相关

 join:等待调用join方法的线程结束之后,程序再继续执行,一般用于等待异步线程执行完结果之后才能继续运行的场景,能实现线程同步;
 join(long n):等待线程运行结束,最多等待n毫秒。

线程类型相关

 thread.setDaemon(true):设置守护线程,心跳检测、事件监听、垃圾回收器都采用。

线程信息获取与修改相关

 getId():获取线程长整型的 id;getName():获取线程名;setName():修改线程名;
 isAlive():线程是否存活(还没有运行完毕)
 getState():获取线程状态;NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED6种状态
 currentThread():获取当前正在执行的线程

线程等待唤醒

 这些方法必须在synchronized块或方法中被调用。

 wait():使当前线程进入等待状态,同时释放对象锁,直到其他线程调用该对象的notify()或notifyAll()方法来唤醒它。
 notify():随机唤醒一个在该对象上等待的线程。
 notifyAll():唤醒所有在该对象上等待的线程,这些线程会竞争对象锁,获得锁的线程才能继续执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容