- 1 停止线程
- 2 线程休眠(sleep)
- 3 线程礼让(yield)
- 4 合并礼让(Join)
- 5 线程状态观测(Thread.State)
- 5 线程优先级(Priority)
- 5 守护线程(Daemon)
- 建议线程正常停止,不建议使用死循环
- 建议使用标志位
- 不要使用stop或者destroy等过时或者JDK不建议使用的方法
public class TestStop implements Runnable {
private boolean flag = true;
@Override
public void run() {
int i = 0;
while (flag) {
System.out.println("run...Thread" + i++);
}
}
public void stop() {
this.flag = false;
}
public static void main(String[] args) {
TestStop testStop = new TestStop();
new Thread(testStop).start();
for (int i = 0; i < 1000; i++) {
System.out.println("Main Thread" + i);
if (i == 900) {
testStop.stop();
System.out.println("线程停止了!");
}
}
}
}
2 线程休眠(sleep)
- sleep(ms) :指定当前线程阻塞的毫秒数
- sleep存在异常InterruptedException
- sleep事件达到后线程进入就绪状态
- sleep可以模拟网络延时,倒计时等
- 每一个对象都有一个锁,sleep不会释放锁
- 让当前执行的线程暂停,但不阻塞
- 将线程从运行状态转为就绪状态
- 让CPU重新调度,礼让不一定成功!
public class TestYield {
public static void main(String[] args) {
MyYield myYield = new MyYield();
new Thread(myYield,"A").start();
new Thread(myYield,"B").start();
}
}
class MyYield implements Runnable{
@Override
public void run(){
System.out.println(Thread.currentThread().getName()+"线程开始执行");
Thread.yield();
System.out.println(Thread.currentThread().getName()+"线程停止执行");
}
}
4 合并礼让(Join)
待次线程执行完成后,再执行其他线程,其他线程阻塞
public class TestJoin {
public static void main(String[] args) throws InterruptedException {
MyJoin myJoin = new MyJoin();
Thread thread = new Thread(myJoin);
thread.start();
for (int i = 0; i < 1000; i++) {
if (i == 200) {
thread.join();
}
System.out.println("main" + i);
}
}
}
class MyJoin implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("线程vip来了" + i);
}
}
}
5 线程状态观测(Thread.State)
Thread.State是枚举类型
public class TestState {
public static void main(String[] args) {
Thread thread = new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("///");
});
// 观察状态
Thread.State state = thread.getState();
System.out.println(state); // NEW
// 观察启动后
thread.start(); // 启动线程
state = thread.getState();
System.out.println(state); // Run
while (state != Thread.State.TERMINATED){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
state = thread.getState(); // 更新线程状态
System.out.println(state);
}
thread.start(); // 报错,已经死的线成不能start
}
}
5 线程优先级(Priority)
public class TestPriority {
public static void main(String[] args) {
MyPriority myPriority = new MyPriority();
Thread t1 = new Thread(myPriority, "Thread1");
Thread t2 = new Thread(myPriority, "Thread2");
Thread t3 = new Thread(myPriority, "Thread3");
Thread t4 = new Thread(myPriority, "Thread4");
Thread t5 = new Thread(myPriority, "Thread5");
t1.setPriority(10);
t2.setPriority(8);
t3.setPriority(6);
t4.setPriority(3);
t5.setPriority(1);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}
}
class MyPriority implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "say hello !!!");
}
}
要先设置线程的优先级,然后在启动线程,优先级高表示被操作系统调度的几率高,优先级低表示被操作系统调度的几率低,所以不能百分百保证优先级高的线程肯定被先调度,还是要看处理器“心情"
5 守护线程(Daemon)线程分为用户线程和守护线程
虚拟机必须确保用户线程执行完毕
虚拟机不能等待守护线程执行完毕
守护线程一般是记录操作日志,监控状态,垃圾回收等
public class TestDaemon {
public static void main(String[] args) {
God god = new God();
You you = new You();
Thread t1 = new Thread(god);
t1.setDaemon(true); // 守护线程
t1.start();
new Thread(you).start(); // 用户线程
}
}
class God implements Runnable{
@Override
public void run(){
while (true){
System.out.println("上帝保护着你");
}
}
}
class You implements Runnable{
@Override
public void run(){
for (int i = 0; i < 10; i++) {
System.out.println("你一生都开始的活着");
}
System.out.println("goodbye world");
}
}



