1、保证一个线程执行完成后另一个线程开始执行
void join()
public class TestAdd {
private static int sum;
public static void main(String[] args) {
Thread t1 = new Thread() {
public void run() {
for(int i=1;i<=100;i++)
sum = sum+i;
}
};
Thread t2 = new Thread() {
public void run() {
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(sum);
}
};
t1.start();
t2.start();
}
}
线程t2等待线程t1执行完毕后,再执行。
2、线程Thread类的一些常用方法:
public class TestCurrentThread {
public static void main(String[] args) {
Thread t = Thread.currentThread();
System.out.println(t.getName()); //线程名字
System.out.println(t.getId()); //线程id
/*
*设置优先级(未必能达到使线程先运行的目的)
*优先级1-10,默认为5,越大优先级越高
*/
t.setPriority(10);
System.out.println(t.getPriority()); //获得线程优先级
System.out.println(t.isAlive()); //是否是alive
System.out.println(t.isDaemon()); //是否是守护线程
System.out.println(t.isInterrupted()); //是否被打断
System.out.println(t.getState()); //获得线程的状态
}
}
3、sleep()和interrupt()方法
(1)sleep方法:
void sleep(long ms);
是Thread类提供的静态方法,参数是long类型的毫秒值。表示让线程休眠ms秒,在此过程中,如果线程被打断,会抛出InterruptedException异常。如果休眠过程一直没有被打断,时间一到,线程的休眠状态就会自动解除,等待CPU的到来,一旦CPU到达,就会继续执行。
(2)interrupt()方法:
void interrupt();
手动打断某个正在休眠的线程,一旦调用该方法,正在休眠的线程会抛出InterruptedException异常(我们想要打断的线程调用该函数)
4、线程同步:
线程同步是解决线程安全问题的方法。同步指做完一个之后另一个再做,异步指各做各的/
如何进行线程同步:
(1)同步方法(在方法上加锁synchronized)
(2)同步代码块(在代码块处加锁)范围尽量越小越好
锁对象:要执行线程同步的对象,可以是任意对象,但要求每个线程看到的锁对象必须是同一对象,是放在synchronized()括号内的对象。
以商场试衣间试衣服为例子(为避免两个顾客同时进入一个试衣间,在顾客进入试衣间的动作开始加锁,用户走出试衣间锁部分结束):
package day02;
public class TestShiyijian {
public static void main(String[] args) {
Shopmall shop = new Shopmall();
MyTask task1 = new MyTask(shop);
MyTask task2 = new MyTask(shop);
Thread t1 = new Thread(task1);
Thread t2 = new Thread(task2);
t1.start();
t2.start();
}
}
class MyTask implements Runnable{
private Shopmall shop;
public MyTask(Shopmall shop) {
this.shop = shop;
}
@Override
public void run() {
// TODO Auto-generated method stub
shop.tryput();
}
}
class Shopmall{
private Object obj = new Object();
public void tryput() {
System.out.println("用户进入商城");
System.out.println("开始挑衣服");
synchronized(this) {
System.out.println("进入试衣间");
for(int i=1;i<=5;i++) {
System.out.println("试穿衣服,第"+i+"步");
}
System.out.println("试穿结束,走出试衣间");
}
}
}
运行结果:
用户进入商场。。
开始挑衣服。。
进入试衣间。。
用户进入商场。。
开始挑衣服。。
试穿衣服,第0步
试穿衣服,第1步
试穿衣服,第2步
试穿衣服,第3步
试穿衣服,第4步
试穿结束,走出试衣间
走出商场
进入试衣间。。
试穿衣服,第0步
试穿衣服,第1步
试穿衣服,第2步
试穿衣服,第3步
试穿衣服,第4步
试穿结束,走出试衣间
走出商场
5、wait和notify
wait()导致线程等待
notifyAll()唤醒所有处于等待状态的进程,获得CPU的线程执行,未获得CPU的继续等待
6、线程的状态
(1)新建状态 new 创建线程
(2)就绪状态 .start()
(3)运行状态 .run()
(4)阻塞状态
-- 等待阻塞 .wait()
-- 同步阻塞 锁对象被其他线程专用,当前线程等待其他线程释放锁对象
-- 其他阻塞 .sleep() .join()
(5)死亡状态 线程体执行完毕,线程死亡