1.sleep与wait的区别
sleep() 方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行
wait 方法可以中断线程的执行,使本线程等待,让出cpu资源,使其他线程得到该资源运行。
如果这时使用 notify() 方法,则通知该线程结束等待(注意:notify的作用相当于叫醒睡着的人,而并不会给他分配任务,就是说notify只是让之前调用wait的线程有权利重新参与线程的调度)
如果这时使用 notifyAll() 方法,曾中断的线程就会从中断处继续执行线程
2.线程同步synchronized
当一个线程A使用synchronized方法时,其他线程想使用这个synchronized方法就必须等待,直到该线程使用完synchronized方法
package 线程同步synchronized;
public class Synchronized implements Runnable {
public static void main(String[] args) {
new Thread(new Synchronized(),"小美").start();
new Thread(new Synchronized(),"小绿").start();
}
@Override
public void run() {
test();
}
public static synchronized void test() {// synchronized方法
for (int i = 0; i <5; i++) {
System.out.println(Thread.currentThread().getName()+"当前数字"+i);
}
}
}
3.interrupt()
interrupt()常用来吵醒休眠的线程。当一些线程调用sleep()方法处于休眠时,一个占有cpu资源的线程可以让休眠的线程调用interrupt()方法“吵醒自己”,及导致休眠的线程发生interruptedException异常,从而结束休眠
4.线程联合 join()
一个线程A在占有cpu资源期间,可以让其他资源调用join()和本线程联合,如:
B.join();
党A在运行期间联合了B,A线程立即中断执行,一直等到他联合的B线程执行完毕,A线程再重新排队等待CPU资源。
5.守护线程setDaemon()
thread.setdeamon(true);
将一个线程设为守护线程
该方法需要线程启动前执行(即写在thread.start()前面)
当程序中所有用户线程结束时,及时守护线程的run方法还有需要执行的一些语句,守护线程也立即结束
package 守护线程;
public class deamon implements Runnable{
public static void main(String[] args) {
Thread thread =new Thread(new deamon(),"小王");
thread.setDaemon(true);
thread.start();
System.out.println("定");//主线程
}
@Override
public void run() {
test();
}
public static void test() {
for (int i = 1; i <= 500; i++) {
System.out.println(Thread.currentThread().getName()+i+Thread.currentThread().isDaemon());
}
}
}
6.yield()
yield 礼让线程,暂停线程 直接进入就绪状态不是阻塞状态(cpu重新分配资源)