stop
实现类写一个标志位和一个停止函数
private boolean flag=true;
public void stop()
{
this.flag=false;
}
执行线程的run方法可以被标志位控制是不是继续运行
public void run()
{
while(flag)
{
......
}
}
stop()是当前类的函数 停止的时候是当前类在调用stop 不是线程对象
sleep
会有一个InterruptedException e异常
直接在其他的类常常直接调用 Thread.sleep()
作用:计时器 倒计时
int times=10;
while(times>0)
{
sout(times);
try{
Thread.sleep(1000);
}
catch(InterruptedException e){
e.printStackTrace();
}
times--;
}
Date date=new Date(System.currentTimeMills());
while(true)
{
sout(new SimpleDateFormat("HH:mm:ss").format(date));
try{
Thread.sleep();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
date=new Date(System.currentTimeMills());
}
yeid()
线程放弃当前的CPU资源(暂停但那时不会阻塞),让其他任务去占用CPU,但是未必能礼让成功,全看CPU的选择
礼让成功会让给另一个线程去执行 礼让不成功本线程结束
public static void main(String[] args) {
Yeild a=new Yeild();
new Thread(a,"01").start();
new Thread(a,"02").start();
}
@Override
public void run() {
System.out.println( Thread.currentThread().getName()+"在执行");
Thread.yield();//正常会走完run
System.out.println( Thread.currentThread().getName()+"结束把");
}
join
join具体产生一个 使线程排队的果效
现实状况:一般主线程的子线程如果耗时比主线程长 但是主线程还想在子线程结束之后再结束
解决:那就在子线程对象.start()后面加一句子线程对象.join() join()方法会无限期的阻塞主线程 直到子线程完全执行完并销毁线程对象 才让主线程执行
Thread vip= new Thread(new Join());
vip.start();
try {
vip.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 100; i++) {
System.out.println("主线程希望子线程结束了我再跑"+i);
}
public void run()
{
for (int i = 0; i < 1000; i++) {
System.out.println("子线程在跑");
}
}
wait 与 notify 的搭配
还没获得锁对象 不能调用
notify()和wait()的搭配 如果你想唤醒你希望执行的线程可以在当前线程上使用while(!flag){ wait()}
只要flag不成立就回循环的wait()
直到notify的时候指定那个flag成立就总回唤醒那个线程
线程状态
Thread.State是state的数据类型
线程对象调用getState()
Thread.State state = thread.getState();
模拟一个线程的run方法先睡5s再执行一句话
在每有调用start()之前都只是NEW
调用start之后是Runnable
while(线程不是停止状态)打印状态
睡眠等待这5s 都是wait
最后会是termui结束
死亡之后的线程是不能再重启的
线程优先级
线程的优先级1-10
Thread.MIN_PRIORITY;1
Thread.MAX_PRIORITY;10
Thread.NORM_PRIORITY;5 默认的线程都是5 公平竞争
优先级高的线程会占用更多的CPU资源 CPU会为优先级高的进程分配更多的时间片 但不意味着优先级高的就第一个执行 而是概率上优先执行
可以通过 开几个子线程 设置完了每个线程的优先级 thread.setPriority()
再satrt()开始跑
守护线程
Java有两种线程:
一种是用户线程/非守护线程 一种是守护线程
当进程中不存在非守护线程,守护线程就自动销毁
典型的守护线程是垃圾回收线程
虚拟机必须确保用户线程执行完毕 虚拟机不用等待守护线程执行完毕 用户线程指向完可能等待一会 就直接关闭了
线程设置为守护线程thread.setDaemon(true)
并且设置守护线程语句要在thread.start()
之前就设置
模拟:守护线程在死循环中跑 非守护线程计时停止 优先设置守护线程
打印的时候 非守护线程结束后 守护线程不一会也跟着销毁死循环终止
public class daemon {
public static void main(String[] args) {
Thread t1=new Thread(new Forever());
Thread t2=new Thread(new Son());
t1.setDaemon(true);
t1.start();
t2.start();
}
}
class Forever implements Runnable{
@Override
public void run() {
while (true)
{
System.out.println("守护");
}
}
}
class Son implements Runnable
{
@Override
public void run() {
for (int i = 0; i < 36500; i++) {
System.out.println("活了一天");
}
sout("用户线程结束了")
}
}