目录
一、线程命名与取得
多线程的运行状态是不确定的,所以对于多线程操作必须有一个明确标识出线程对象的信息,这个信息往往通过名称来描述。在 Thread 类中提供有如下的线程名称方法:
No | 方法名 | 类型 | 功能 |
---|---|---|---|
1 | public Thread(Runnable targrt,String name) |
构造方法 | 创建线程的时候设置名称 |
2 | public final synchronized void setName(String name) |
普通方法 | 设置线程名称 |
3 | public final String getName() |
普通方法 | 取得线程名称 |
4 | public static native Thread currentThread() |
本地方法 | 取得线程对象 |
class MyThread implements Runnable {
private int ticket = 10;
@Override
public void run() {
while (this.ticket > 0) {
System.out.println("当前线程:" + Thread.currentThread().getName() + " ,剩余票数:" + this.ticket--);
}
}
}
public class Test {
public static void main(String[] args) {
MyThread mt = new MyThread();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt, "线程A").start();
}
}
如果没有设置线程名称,则会自动分配一个线程名字,从0开始。
二、线程休眠Thread.sleep()----单位(ms)
让线程暂缓执行一下,等到了预计时间之后再恢复执行。
- 线程休眠会立即交出CPU,让CPU去执行其他任务
- 线程休眠不会释放对象锁
class MyThread implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("当前线程:" + Thread.currentThread().getName() + " ,i = " + i);
}
}
}
public class Test {
public static void main(String[] args) {
MyThread mt = new MyThread();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
}
}
通过代码观察会错误的认为这三个线程是同时休眠的,但是千万要记住,所有的线程是依次进入到run()方法中的。真正进入到run方法的对象可能是多个,也可能是一个。进入代码的顺序可能有差异,但是总体的执行是并发执行。
三、线程让步Thread.yield()
暂停当前正在执行的线程对象,并执行其他线程。
- yield( )会让当前线程交出CPU,但不一定立即交出
- yield不能控制具体的交出CPU的时间
- yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会
- yield( )不会释放对象锁
- 调用 yield 方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,所以,执行yield( )方法的线程有可能在进入到就绪状态后马上又被执行了
class MyThread implements Runnable {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
Thread.yield();
System.out.println("当前线程:" + Thread.currentThread().getName() + ",i=" + i);
}
}
}
public class Test {
public static void main(String[] args) {
MyThread mt = new MyThread();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
}
}
四、线程插队join()
在线程a中调用线程b的join,此时线程a就进入阻塞状态,直到线程b完全执行完以后,线程a才结束阻塞状态
join()
方法只是对Object类的wait()
方法做了一层包装而已。
4.1案例1
class MyThread implements Runnable {
@Override
public void run() {
try {
System.out.println("Begin ThreadImpl");
Thread.sleep(5000);
System.out.println("End ThreadImpl");
} catch (InterruptedException e