javajava 加入一个线程、创建有响应的用户界面 。 示例代码

来自thinking in java 4 21章 部分代码 目录21.2.11

package org.rui.thread.concurrent;

/**

* 加入一个线程

* 一个线程可以在其他线程之上调用join()方法,其效果是等待一段时间直到第二个线程结束才继续执行。

* 如果某个线程在另一个线程T上调用t.join() 此线程将被挂起,直到目标线程t结束才恢复(即 t.isAlive()返回为假)

* @author lenovo

*

*/

class Sleeper extends Thread

{

private int duration;

public Sleeper(String name,int sleepTime)

{

super(name);

duration=sleepTime;

start();

}

/**

* Sleeper 它要休眠一段时间

*/

@Override

public void run() {

try {

sleep(duration);

} catch (Exception e) {

//根据 isInterrupted的返回值报告这个中断,当另一个线程在该线程上调用interrupt()时,

//将给该线程设定一个标志,表明该线程已经中断,然而,异常被捕获时将清理这个标志,所以在catch子句中,

//在异常被捕获的时候这个标志总是为假。除异常之外,这个标志还可有于其他情况,比如线程可能会检查其中断状态

System.out.println(getName()+ was interrupted.+isInterrupted() + isInterrupted());

return;

}

System.out.println(getName()+ has awakened);

}

}

//

class Joiner extends Thread

{

private Sleeper sleeper;

public Joiner(String name,Sleeper sleeper)

{

super(name);

this.sleeper=sleeper;

start();

}

@Override

public void run() {

/**

* Joiner 线程将通过在sleeper对象上调用join方法来等待sleeper醒来.在main里面

* 每个sleeper都有一个joiner,这可以在输出中发现,如果sleeper被 中断或者是正常结束,

* joiner将和sleeper一同结束

*

*/

try {

sleeper.join();

} catch (InterruptedException e) {

System.out.println(interrupted);

}

System.out.println(getName()+ join completed);

}

}

//

public class Joining {

public static void main(String[] args) {

//线程1

Sleeper sleepy=new Sleeper(Sleepy,1500),

grumpy=new Sleeper(Grumpy,1500);

//

Joiner Dopey=new Joiner(Dopey,sleepy),

doc=new Joiner(doc,grumpy);

grumpy.interrupt();

}

}

/**

* 注意,java SE5的java.util.concurrent类库包含诸如CyclicBarrier这样的工具。

* 它们可能比最初的线程类库中的join更加合适

* output:

Grumpywas interrupted.isInterrupted() false

doc join completed

Sleepy has awakened

Dopey join completed

*/

package org.rui.thread.concurrent;

/**

* 创建有响应的用户界面

* 一个关注于运算,所以不能读取控制台输入,另一个把运算放在任务里单独运行,

* 此时就可以在进行运算的同时监听控制台输入

* @author lenovo

*

*/

//无反应的

class UnresponsiveUI

{

private volatile double d=1;

public UnresponsiveUI()throws Exception

{

while(d>0)

d=d+(Math.PI+Math.E);

System.in.read();// 永远不会在这里

}

}

public class ResponsiveUI extends Thread {

private volatile static double d=1;

public ResponsiveUI()

{

setDaemon(true);

start();

}

@Override

public void run() {

//无限循环,显然程序 不可能到达读取控制台输入的那一行(编译器被欺骗了,相信while的条件使得程序能到达读取控制台输入的那一行)。

//如果把建立UnresponsiveUI的那一行的注释解除掉再运行程序,那么要终止它的话,就只能杀死这个进程

while(true)

d=d+(Math.PI+Math.E)/d;

}

public static void main(String[] args) throws Exception {

//4new UnresponsiveUI();// 必须杀了这个线程

new ResponsiveUI();

System.in.read();

System.out.println(d);//显示上传进度

/**

* 要想让程序有响应,就得把计算程序放在run方法中,这样它就能让出处理器给别的程序。

* 当你按下‘回车’健的时候,可以看到计算确实在作为后台程序运行,同时还在等待用户输入。

*/

}

}

/**

input:

hello

output: 根据停留时间输出:

68130.17629894095

*/

java 用户线程如何修改界面内容_java 加入一个线程、创建有响应的用户界面 。 示例代码...相关推荐

  1. java编写两个线程,一个线程打印1-52的整数,另一个线程打印字母A-Z。打印顺序为12A34B56C….5152Z。即按照整数和字母的顺序从小到大打印,并且每打印两个整数后,打印一个字母,交替

    2.编写两个线程,一个线程打印1-52的整数,另一个线程打印字母A-Z.打印顺序为12A34B56C-.5152Z.即按照整数和字母的顺序从小到大打印,并且每打印两个整数后,打印一个字母,交替循环打印 ...

  2. 工作中如何使用线程池的?自己如何定义一个线程池?

    工作中如何使用线程池的?自己如何定义一个线程池? import java.util.concurrent.*;public class MyThreadPoolDemo {public static ...

  3. 设计两个个线程模拟存取款操作,其中一个线程每次随机存1~1000元钱,另外一个线程取1-1000元钱,如果余额不足,则取款失败,提示余额不足。写出程序(考虑并发问题)。

    设计两个个线程模拟存取款操作,其中一个线程每次随机存1~1000元钱, 另外一个线程取1-1000元钱,如果余额不足,则取款失败,提示余额不足. 写出程序(考虑并发问题). import java.u ...

  4. 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来

    题目要求: 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来.(这是一道百度面试的算 ...

  5. 关于PrintQueueCollection()类,跨线程调用错误“线程无法访问此对象,因为另一个线程拥有该对象”

    使用System.Printing.PrintQueueCollection()   纸质打印机获取 _generalPrinters = new PrintQueueCollection(); pu ...

  6. java读取修改文件内容_Java对本地文件内容读取、修改、删除的操作

    import org.apache.commons.lang.StringUtils; import java.io.*; import java.util.HashMap; import java. ...

  7. java线程和进程的区别_Java中的线程和进程比较

    1.进程和线程的区别 通俗一点说,进程就是程序的一次执行,而线程可以理解为进程中的执行的一段程序片段. 用一点文词说就是,每个进程都有独立的代码和数据空间(进程上下文);而线程可以看成是轻量级的进程. ...

  8. java怎样中断函数_Java中断一个线程操作示例

    本文实例讲述了Java中断一个线程操作.分享给大家供大家参考,具体如下: 一 点睛 中断一个线程,意味着该线程在完成任务之前,停止它正在进行的一切当前的操作. 有三个比较常用的函数: interrup ...

  9. java中怎么让一个数倒转_java 输入一个数字,反转输出这个数字的值(实现方法)

    java 输入一个数字,反转输出这个数字的值(实现方法) 如下所示: package 第四天; import java.util.Scanner; public class 数字反转 { public ...

最新文章

  1. August 14, 2009 - Choice
  2. java搜索文件夹中文件是否存在_java中判断文件文件夹是否存在的方法(附代码)...
  3. MySQL-MHA搭建
  4. 设置tomcat使用指定的jdk版本
  5. Android6.0------权限申请管理(单个权限和多个权限申请)
  6. 进入正在运行的Docker容器的4种方式
  7. JAVA如何才能导出这样的EXCEL?
  8. python高阶函数、map reduce 自己如何去定义_小猿圈python之高阶函数lambda、map和reduce用法...
  9. 一维数组kmeans聚类c语言,一维数组的 K-Means 聚类算法理解
  10. 去除Android 6.0 界面下的导航栏:NavigationBar
  11. VCLSkin皮肤在MDI窗体下的问题
  12. ini更改文件夹图标
  13. 泰坦尼克号预测python_泰坦尼克号生存预测(python)
  14. 分别用Java应用程序和Applet程序实现星星三角形图案的绘制
  15. 产业互联网周报 | 上海数交所:数据产品交易额预计全年超过1亿元;Zoom单季度净利润同比下降86%;...
  16. 电信诈骗瞄准“徐玉玉”们,扣问网络安全教育短板
  17. java实现文本纠错功能_调用百度API进行文本纠错
  18. ctrl键频繁失灵,但不是键盘本身的问题,换个键盘同样失灵
  19. 网页打开手机连接到服务器失败,手机服务器无法连接到服务器失败
  20. 2023安徽工程大学计算机考研信息汇总

热门文章

  1. 我们在面临种种不良的飞鸽传书2012
  2. qq音乐2012绿色版
  3. 成绩出来,C++专业课没问题
  4. 诺基亚计划推出高档触摸屏手机以对抗iPhone
  5. 10个Python编程窍门,不懂就亏了
  6. 优秀的程序员应该掌握多少门编程语言?
  7. 从“小白”到“白帽子黑客”的实用指南
  8. docker初级操作
  9. 高通量数据中批次效应的鉴定和处理(六)- 直接校正表达矩阵
  10. Seurat亮点之细胞周期评分和回归