1. 程式人生 > >java線程返回值討論

java線程返回值討論

程序 數據 @override sync 執行 ons generated ride cin

java線程返回值討論
在線程當中,返回值是個很大的問題。比如:在線程執行到某一步的時候要將數據返回,在程序執行完成後要返回值。
在java中,線程的返回值可以使用Future<T>來獲取,也可以使用其他的手段。以下討論一些返回值的一些小手段:
1、使用靜態變量來進行值的返回
使用靜態變量來進行值的返回是最簡單的一種,也是不可取的一種,這種不僅帶來線程的安全性,同時內存一直不能釋放,直到系統退出才能釋放內存,因此會造成內存花費很多,但是真正在使用的很少。
2、使用Futuren<T>來獲取
這個不用過多的解釋,查看java線程
3、使用反向調用
使用反向調用的就是將當前的對象或者是某個類的實例傳入到線程當中,當需要調用時就進行調用。如下圖:

技術分享圖片
技術分享圖片
代碼:

//調用的類
package cn.com.theadmain;
public class TestThread {
private String testName;
public void setTestName(String name) {
System.out.println(name);
testName = name;
}
public void testThread() throws InterruptedException {
Thread t = new Thread(new ThreadRunnable(this));
t.start();
t.join();
System.out.println(testName);

}
}

//實現線程執行的代碼
package cn.com.theadmain;
public class ThreadRunnable implements Runnable {
private TestThread testThread;
public ThreadRunnable(TestThread testThread) {
// TODO Auto-generated constructor stub
this.testThread = testThread;}
@Override
br/>}
@Override
// TODO Auto-generated method stub
//操作
testThread.setTestName(this.toString());

//操作
}
}

在上面的代碼中,如果成員變量只是提供一個線程進行修改,其他線程只是讀取的話,那麽沒有必要考慮線程安全的問題,如果是多個線程都要對變量進行修改的話,那麽需要考慮到線程安全的問題了。解決線程安全的問題則有兩個方法:
1、在成員變量的前面,在private等的後面添加volatile,就可以解決該變量只有一個線程進行訪問了。
2、在調用的方法上面添加synchronized修飾關鍵字,保證只有一個變量訪問這個方法
3、在調用的方法中,在關鍵的代碼段添加synchronized(成員變量) 就可以保證關鍵的代碼只有一個線程進行訪問了。
4、使用原子類型的變量,比如AtomicInteger,AtomicIntegerArray,使用線程安全的容器,比如ConcurrentHashMap,ConcurrentLinkedQueue, 等。其余的操作在線程結束時操作。

java線程返回值討論