java 用户线程如何修改界面内容_java 加入一个线程、创建有响应的用户界面 。 示例代码...
javajava 加入一個(gè)線程、創(chuàng)建有響應(yīng)的用戶界面 。 示例代碼
來自thinking in java 4 21章 部分代碼 目錄21.2.11
package org.rui.thread.concurrent;
/**
* 加入一個(gè)線程
* 一個(gè)線程可以在其他線程之上調(diào)用join()方法,其效果是等待一段時(shí)間直到第二個(gè)線程結(jié)束才繼續(xù)執(zhí)行。
* 如果某個(gè)線程在另一個(gè)線程T上調(diào)用t.join() 此線程將被掛起,直到目標(biāo)線程t結(jié)束才恢復(fù)(即 t.isAlive()返回為假)
* @author lenovo
*
*/
class Sleeper extends Thread
{
private int duration;
public Sleeper(String name,int sleepTime)
{
super(name);
duration=sleepTime;
start();
}
/**
* Sleeper 它要休眠一段時(shí)間
*/
@Override
public void run() {
try {
sleep(duration);
} catch (Exception e) {
//根據(jù) isInterrupted的返回值報(bào)告這個(gè)中斷,當(dāng)另一個(gè)線程在該線程上調(diào)用interrupt()時(shí),
//將給該線程設(shè)定一個(gè)標(biāo)志,表明該線程已經(jīng)中斷,然而,異常被捕獲時(shí)將清理這個(gè)標(biāo)志,所以在catch子句中,
//在異常被捕獲的時(shí)候這個(gè)標(biāo)志總是為假。除異常之外,這個(gè)標(biāo)志還可有于其他情況,比如線程可能會(huì)檢查其中斷狀態(tài)
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對(duì)象上調(diào)用join方法來等待sleeper醒來.在main里面
* 每個(gè)sleeper都有一個(gè)joiner,這可以在輸出中發(fā)現(xiàn),如果sleeper被 中斷或者是正常結(jié)束,
* joiner將和sleeper一同結(jié)束
*
*/
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;
/**
* 創(chuàng)建有響應(yīng)的用戶界面
* 一個(gè)關(guān)注于運(yùn)算,所以不能讀取控制臺(tái)輸入,另一個(gè)把運(yùn)算放在任務(wù)里單獨(dú)運(yùn)行,
* 此時(shí)就可以在進(jìn)行運(yùn)算的同時(shí)監(jiān)聽控制臺(tái)輸入
* @author lenovo
*
*/
//無反應(yīng)的
class UnresponsiveUI
{
private volatile double d=1;
public UnresponsiveUI()throws Exception
{
while(d>0)
d=d+(Math.PI+Math.E);
System.in.read();// 永遠(yuǎn)不會(huì)在這里
}
}
public class ResponsiveUI extends Thread {
private volatile static double d=1;
public ResponsiveUI()
{
setDaemon(true);
start();
}
@Override
public void run() {
//無限循環(huán),顯然程序 不可能到達(dá)讀取控制臺(tái)輸入的那一行(編譯器被欺騙了,相信while的條件使得程序能到達(dá)讀取控制臺(tái)輸入的那一行)。
//如果把建立UnresponsiveUI的那一行的注釋解除掉再運(yùn)行程序,那么要終止它的話,就只能殺死這個(gè)進(jìn)程
while(true)
d=d+(Math.PI+Math.E)/d;
}
public static void main(String[] args) throws Exception {
//4new UnresponsiveUI();// 必須殺了這個(gè)線程
new ResponsiveUI();
System.in.read();
System.out.println(d);//顯示上傳進(jìn)度
/**
* 要想讓程序有響應(yīng),就得把計(jì)算程序放在run方法中,這樣它就能讓出處理器給別的程序。
* 當(dāng)你按下‘回車’健的時(shí)候,可以看到計(jì)算確實(shí)在作為后臺(tái)程序運(yùn)行,同時(shí)還在等待用戶輸入。
*/
}
}
/**
input:
hello
output: 根據(jù)停留時(shí)間輸出:
68130.17629894095
*/
總結(jié)
以上是生活随笔為你收集整理的java 用户线程如何修改界面内容_java 加入一个线程、创建有响应的用户界面 。 示例代码...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python学习笔记:常用内建模块5
- 下一篇: Python学习笔记:常用内建模块6 (