博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java学习笔记--控制线程运行
阅读量:6076 次
发布时间:2019-06-20

本文共 2650 字,大约阅读时间需要 8 分钟。

hot3.png

  1. 线程的控制很常见,如文件传送到一半时,需要暂停文件传送,或终止文件传送,这实际上就是控制线程的运行。

  2. 线程有创建、可运行、运行中、阻塞、死亡5个状态。

    创建:使用new运算符创建一个线程

    可运行:使用start方法启动一个线程后,系统分配了资源

    运行中状态:执行线程的run方法

    阻塞:运行的线程因为某种原因停止继续运行

    死亡状态:线程结束

  3. 传统方法的安全问题

    Thread的stop(),suspend(),resume(),destroy()方法,因为不安全,可能造成死锁,已经不再使用了。

  4. 如何控制线程的运行

    举个例子,假如某个文件的传输需要10s,让其传输到某个时刻暂停传输,然后继续,到传完为止。使用实现Runnable的方法完成,首先是文件传输的Runnable类

  5. 代码如下:

  6. public class ThreadControlTest1 implements Runnable{ private int percent = 0; public void run() {  while(true)  {   System.out.println("传送进度:"+ percent +"%");   try   {    Thread.sleep(1000);   }   catch(Exception ex)   {}   percent += 10;   if(percent == 100)   {    System.out.println("传送完毕");    break;   }  } } public static void main(String[] args) {  ThreadControlTest1 ft = new ThreadControlTest1();  Thread th = new Thread(ft);  th.start(); } }

    运行,控制台上将打印文件传输的模拟过程。可以看出,如果将该类对象以线程运行,while循环会执行10次后退出。

    但是,需要在某个时刻(如5秒后)暂停线程运行(如1分钟),但又不能使用Thread的相关函数,该怎么办?

    要解决这个问题,常见的方法如下:

    1.当需要暂停时,干脆让线程的run方法结束运行以释放资源(实际上就是让该线程永久结束)

    2.线程需要继续时,新开辟一个线程继续工作

    如何让run方法结束呢,在run方法中有一个while循环,将改循环的标志由true改为false即可。

  7. 上面的代码可以改为如下:

     

  8. public class ThreadControlTest1 implements Runnable{ private int percent = 0; private boolean isRun = true; public void run() {  while(isRun)  {   System.out.println("传送进度:"+ percent +"%");   try   {    Thread.sleep(1000);   }   catch(Exception ex)   {}   percent += 10;   if(percent == 100)   {    System.out.println("传送完毕");    break;   }  } } public static void main(String[] args)  {  ThreadControlTest1 ft = new ThreadControlTest1();  Thread th = new Thread(ft);  th.start();  try  {   Thread.sleep(5000);  }catch(Exception ex)  {}  ft.isRun = false;  System.out.println("暂停一分钟");  try  {   Thread.sleep(1000*60);  }catch(Exception ex)  {}  ft.isRun = true;  th = new Thread(ft);  th.start(); } }
    测试练习: 现有一个程序,需要每隔一毫秒在界面上打印一个“hello”,与此同时,程序也在计算1+2+3+...+100000,算完之后输出。要求在将加法结果输出之后Hello就不打印了,相当于在一个线程里面停掉另一个线程。

    我的代码如下:

     

  9. public class PrintHelloThread extends Thread{ public  static void  SetPrintHelloThreadFlag(boolean flag) {  isPrint = flag; } private static boolean isPrint = true; public void run() {  try  {   while(isPrint)   {    Thread.sleep(1);    System.out.println("Hello");   }  }  catch(Exception ex)  {} } public  static void main(String[] args) {  PrintHelloThread printThread = new PrintHelloThread();  CaculateRunnable r = new CaculateRunnable();  Thread t = new Thread(r);  printThread.start();  t.start();   }}class CaculateRunnable implements Runnable{ public void run() {  int sum =0;  for(int i = 0;i<1000000;i++)  {   sum +=i;  }  System.out.println("sum = "+sum);  PrintHelloThread.SetPrintHelloThreadFlag(false);   }}

转载于:https://my.oschina.net/kingfrog/blog/221917

你可能感兴趣的文章
Android 中 ListView 分页加载数据
查看>>
oracle启动报错:ORA-00845: MEMORY_TARGET not supported on this system
查看>>
Go方法
查看>>
Dapper丶DapperExtention,以及AbpDapper之间的关系,
查看>>
搞IT的同学们,你们在哪个等级__那些年发过的帖子
查看>>
且谈语音搜索
查看>>
MySQL数据库导入导出常用命令
查看>>
低版本Samba无法挂载
查看>>
Telegraf+Influxdb+Grafana构建监控平台
查看>>
使用excel 展现数据库内容
查看>>
C#方法拓展
查看>>
MySql.Data.dll的版本
查看>>
Linux系统磁盘管理
查看>>
hdu 2191 (多重背包+二进制优化)
查看>>
home.php
查看>>
neo4j---删除关系和节点
查看>>
redis分布式锁redisson
查看>>
什么样的企业可以称之为初创企业?
查看>>
Python爬虫之BeautifulSoup
查看>>
《HTML 5与CSS 3权威指南(第3版·下册)》——第20章 使用选择器在页面中插入内容...
查看>>