首页 > 其他分享 >线程状态

线程状态

时间:2023-08-24 18:11:05浏览次数:28  
标签:状态 Thread void System 线程 new public

线程状态

1.总状态

 

 

2.线程方法:
  1. setPriority(int newPriority) :更改线程优先级

  2. static void sleep(long millis):在指定的毫秒数内让当前正在执行的线程休眠

  3. void join():等待该线程终止

  4. static void yield():暂停当前正在执行的线程对象,并执行其他线程

  5. void interrupt():中断线程,别用这个方式

  6. boolean isAlive():测试线程是否处于活动状态

3.停止线程
  1. 不推荐使用JDK提供的stop().destroy()方法。【已废弃】。

  2. 推荐线程自己停下来。

  3. 建议使用一个标志位进行终止变量当flag=false,则终止线程运行。

// 测试stop
// 1.建议线程正常停止----->利用次数,不建议死循环
// 2.建议使用标志位 ---->设置一个标志位
// 3.不推荐使用stop或者destory等过时jdk方法
public class TestStop implements Runnable{
   // 1.设置一个标识位
   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 < 200; i++) {
           System.out.println("main"+i);
           if (i==100){
               // 调用stop发布方法切换标志位,让线程停止
               testStop.stop();
          }
      }
  }
}
4.线程休眠
  1. sleep (时间)指定当前线程阻塞的毫秒数;

  2. sleep存在异常InterruptedException;

  3. sleep时间达到后线程进入就绪状态;

  4. sleep可以模拟网络延时,倒计时等。

  5. 每一个对象都有一个锁,sleep不会释放锁;

// 模拟倒计时
public class TestSleep2 {
   public static void main(String[] args) {
       // 模拟倒计时
       try {
           tenDown();
      } catch (InterruptedException e) {
          e.printStackTrace();
      }
       // 打印系统时间
       Date startTime = new Date(System.currentTimeMillis());//获取当前系统时间
       while (true){
           try {
               Thread.sleep(1000);
               System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
               startTime = new Date(System.currentTimeMillis());//更新时间
          } catch (InterruptedException e) {
               throw new RuntimeException(e);
          }
      }
  }

   //   模拟倒计时
   public static void tenDown() throws InterruptedException{
       int num = 10;

       while (true){
           Thread.sleep(500);
           System.out.println(num--);
           if(num<0){
               break;
          }
      }
  }

}
5.线程礼让
  1. 礼让线程,让当前正在执行的线程暂停,但不阻塞

  2. 将线程从运行状态转为就绪状态

  3. 让cpu重新调度,礼让不一定成功!看CPU心情

//测试礼让线程
// 礼让不一定成功,看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()+"线程停止执行");
  }
}
6.Join方法
  1. Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞(类似插队)

// 测试join方法
public class TestJoin implements Runnable{
   @Override
   public void run() {
       for (int i = 0; i < 1000; i++) {
           System.out.println("线程vip来了"+i);
      }
  }

   public static void main(String[] args) throws InterruptedException {
       //启动我们的线程
       TestJoin testJoin = new TestJoin();
       Thread thread = new Thread(testJoin);
       thread.start();
       
       // 主线程
       for (int i = 0; i < 500; i++) {
           if(i==200){
               thread.join(); //插队
          }
           System.out.println("main"+i);
      }
  }
}
 

标签:状态,Thread,void,System,线程,new,public
From: https://www.cnblogs.com/yuan947022015/p/17654845.html

相关文章

  • 多线程|加锁操作
    classCounter{publicintcount=0;publicvoidadd(){count++;}}publicclasssynDemo{publicstaticvoidmain(String[]args){Countercounter=newCounter();Threadt1=newThread(()->{for(inti=......
  • 在有状态更新的dfs中一定要先更新状态,不然没有更新就查看下一个点了,会有多余运行
    例题P5318【深基18.例3】查找文献-洛谷|计算机科学教育新生态(luogu.com.cn)#include<bits/stdc++.h>#include<vector>#include<queue>#definerep(i,a,b)for(inti=a;i<=b;++i)#definedrep(i,a,b)for(inti=a;i<b;++i)usingnamespacestd;#define......
  • allure报告中firefox信息不展示(多浏览器或多线程执行时只显示一个浏览器的日志)
    安装的allure-pytest的版本要是2.11.1之前的(之后的版本有test_result.historyId,但位置及方法不一样,我目前没研究怎么修改)在依赖包Lib--site-packages--allure_pytest--listener.py文件里修改test_result.historyId=md5(item.nodeid)变成test_result.historyId=md5(item.nod......
  • Ubuntu22隐藏上方的状态栏(hide top bar):安装hide top bar这个GNOME插件
    参考链接:https://techithings.hashnode.dev/ubuntu-how-to-hide-top-bar-and-side-bar具体步骤1.安装extensionmanger这个软件sudoapt-getupdatesudoapt-getinstallgnome-shell-extension-manager-y2.打开软件extension-manager3.点击browse,搜索hidetopbar这个插......
  • 《asyncio 系列》1. 什么是 asyncio?如何基于单线程实现并发?事件循环又是怎么工作的?
    https://www.cnblogs.com/traditional/p/17357782.html楔子许多应用程序,尤其在当今的Web应用程序领域,严重依赖IO操作。这些类型的操作包括从Intermet下载网页的内容、通过网络与一组微服务进行通信,或者针对MySOL、Postgres等数据库同时运行多个查询。Web请求或与微服......
  • Vue3 中 keepAlive 如何搭配 VueRouter 来更自由的控制页面的状态缓存?
    在vue中,默认情况下,一个组件实例在被替换掉后会被销毁。这会导致它丢失其中所有已变化的状态——当这个组件再一次被显示时,会创建一个只带有初始状态的新实例。但是vue提供了keep-alive组件,它可以将一个动态组件包装起来从而实现组件切换时候保留其状态。本篇文章要介绍的......
  • Docker-Swarm启动服务一直处于New状态
    一、情况描述​ 近期有个项目的开发环境需要迁移nas挂载盘,需要把开发环境的服务停止,待迁移完成后重启服务。​ 该环境使用的docker-swarm启动服务,之前考虑的是swarm是docker原生支持的,启动方便,命令也较为简单,能够满足使用需求。待更换nas盘完成,通知我启动服务。​ 按照正常......
  • 线程
    线程1.多任务2.多线程线程就是独立的执行路径;main()称之为主线程,为系统的入口,用于执行整个程序;3.程序,进程,线程在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程;在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相......
  • lock解决线程安全问题,与synchronize区别,同步的三种方式
    packagecom.atjava.test;importjava.util.concurrent.locks.ReentrantLock;classWindow1implementsRunnable{privateintticket=100;privateReentrantLocklock=newReentrantLock();@Overridepublicvoidrun(){while(true)......
  • 进程、线程、协程
    进程内可开启多个线程,线程内可开启多个协程进程、线程可以利用cpu多核来并行,协程是切换成本低,不是并行。 ......