java 多线程

73 阅读2分钟

重写run方法

public void run(){
}

继承Thread类

使用方法:

new MyThread().start()
或
MyThread t=new MyThread();
Thread tt=new Thread(t);
tt.start();

说明:

  • Thread类有sleep方法,伴随InterruptedException
  • setName方法设置线程名,可用getName获取
  • 设置线程名法二:Thread tt=new Thread(t,name:);
  • Thread的currentThread()方法获取当前的线程的实例对象
  • thread.setDaemon(true);设置为后台线程

实现Runnable接口

MyThread t=new MyThread();
Thread tt=new Thread(t);
tt.start();

线程优先级

线程的优先级用1~10之间的整数表示,数字越大优先级越高,Thread类的setPriority()方法进行设置,setPriority()方法中的参数newPriority接收的是1~10之间的整数或者Thread类的三个静态常量。

线程插队

Thread.join()等待插入的线程指定时间过后才会继续执行其他线程。

Thread.join(long millis)等待插入的线程指定时间过后才会继续执行其他线程。

线程让步

通过yield()方法可以实现线程让步,让当前正在运行的线程失去CPU使用权,让系统的调度器重新调度一次,由于JVM默认采用抢占式调度模型,所有线程都会再次抢占CPU资源使用权,所以在执行线程让步后并不能保证立即执行其他线程,CPU可能会有一段空闲时间。

线程中断

public void interrupt():表示中断当前线程对象。每个线程对象都是通过一个标志位来判断当前是否为中断状态。

public boolean isInterrupted():表示用来获取当前线程对象的标志位的。该方法有true和false两个返回值,true表示清除了标志位,当前线程对象已经中断;false表示没有清除标志位,当前对象没有中断。

线程同步

同步块

synchronized(Object lock){
}

同步方法

synchronized function(){}

被synchronized修饰的方法在某一时刻只允许一个线程访问,访问该方法的其他线程都会发生阻塞,直到当前线程访问完毕后,其他线程才有机会执行。

线程通信

image.png

wait()、notify()和notifyAll()方法的调用者都应该是同步锁对象,如果这三个方法的调用者不是同步锁对象,Java虚拟机就会抛出IllegalMonitorStateException异常。

synchronized(Object lock){
    lock.wait();
}
synchronized(Object lock){
    lock.notify();
}