Thread多线程(二)
线程的五种状态:新生、就绪、执行、阻塞、死亡
终止线程的两种方式:
1、线程正常执行完毕
2、在线程中加入逻辑控制线程执行完毕:标识符
注意:不要使用stop、destroy方法终止线程
示例:利用标志位控制线程终止
public class FlagThread implements Runnable{ private boolean flag = true ; private String name ; public FlagThread(String name) { this.name = name ; } @Override public void run() { int i=0 ; while(flag) { System.out.println(this.name + "-->" + i++); } } public void exit() {//对外提供一个方法终止线程 this.flag = false ; } public static void main(String[] args) { FlagThread f = new FlagThread("线程一") ; new Thread(f).start(); for(int i=0;i<50;i++) { if(i==47) { f.exit(); System.out.println("线程终止......."); } System.out.println("main:"+i); } } }
sleep方法:静态方法
1、指定时间为毫秒
2、要抛出一个异常InterruptedException
3、资源被锁定,sleep不会释放锁
4、时间到之后线程进入就绪状态
5、可以模拟网络延时、倒计时
yield:静态方法
1、礼让线程,让出CPU,让CPU调度重新调度,让当前正在执行线程暂停
2、不是阻塞线程,而是将线程从运行状态转入就绪状态
join:成员方法
如果线程对象①在线程②中调用了join方法,则线程②要在相应代码位置处等待线程①执行完毕,
才能继续执行线程②剩下的代码
示例:
public class Demo { public static void main(String[] args) throws InterruptedException { Thread t = new Thread(()->{ for(int i=0;i<30;i++) { System.out.println("线程........"+i); } }) ; t.start(); for(int i=0;i<30;i++) { if(i==20) { t.join(); } System.out.println("main........."+i); } } }
线程优先级
1、如果不使用,可以设置范围:1~10
2、先设置优先级,然后在启动
示例:
public class Demo2 implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName()+"--->"+Thread.currentThread().getPriority()); Thread.yield(); } public static void main(String[] args) { System.out.println(Thread.currentThread().getName()+"--->"+Thread.currentThread().getPriority()); Demo2 d = new Demo2() ; Thread t = new Thread(d) ; Thread t2 = new Thread(d) ; Thread t3 = new Thread(d) ; t.setPriority(Thread.MIN_PRIORITY); t2.setPriority(Thread.NORM_PRIORITY); t3.setPriority(Thread.MAX_PRIORITY); t.start(); t2.start(); t3.start(); } }
zwy

浙公网安备 33010602011771号