Thread常用方法

在这里插入图片描述

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("用户线程结束了")
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值