线程的实现方式:
- 继承Thread类
- 重写子类的run方法
- 创建该子类的对象
线程的常用API
- static void sleep(long millis)
线程睡眠:在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响,该线程不丢失任何监视器的所属权
public class ThreadControlDemo1 {
public static void main(String[] args) throws InterruptedException {
Thread.sleep(2000);
//注意:这句代码放在哪个线程中,哪个线程在执行到这句代码时就会休眠
//此线程就会进入阻塞态,当给定的休眠时间到该线程又会重新进入就绪态,等待CPU
TimeUnit.MILLISECONDS.sleep(1000);
for (int i = 0; i <10 ; i++) {
System.out.println("haha");
}
}
}
-public void interrupt()
中断线程:如果线程在调用Object类的wait、join、sleep方法中受阻,则其中断状态将被清除,它还将收到一个InterruptedException;interrupt可以在一个线程中控制另一个线程,这种控制能力依赖的是异常的代码控制
如果中断一个没有处于休眠或者等待状态的线程,是没有任何左右的。
- public final void join() throw InterruptedException
线程加入:join在哪个线程当中调用,那么就等到这个线程执行完代码
- yield();
线程礼让:yield是对调度器的一个建议,但是调度器可以忽略这个建议
- public final void setDaemon(boolean on)
后台线程(守护线程):将该线程标记为守护线程(后台线程),如果当前线程全部为守护线程时,JVM退出;(该方法必须在启动线程前调用)
- public final void setPriority(int newPriority)
Thread类中的priority只是给JVM一个优先级的建议,并不在线程调度中起决定作用
两种实现线程的方式的比较
- 第一种方式受限于java的单重继承
//无法继承两个类
class MyThread extends A,Thraed{
}
- 第二种方式不会受限于单重线程,而且便于多线程共享数据
/*
创建线程的另一种方法是声明实现Runable接口的类。然后实现run方法
*/
public class ThreadControlDemo3 implements Runnable{
@Override
public void run() {
}
}