java 用户线程如何修改界面内容_java 加入一个线程、创建有响应的用户界面 。 示例代码...
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 加入一个线程、创建有响应的用户界面 。 示例代码...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python学习笔记:常用内建模块5
- 下一篇: Python学习笔记:常用内建模块6 (