线程之线程共享成员变量的几种情况
生活随笔
收集整理的這篇文章主要介紹了
线程之线程共享成员变量的几种情况
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
public class ThreadScopeMultiShareData {
/**
* 多線程之間的共享數據的方式
*/
/*
* 如果每個線程執行的代碼一樣,可以使用同一個runnable對象,這個共享數據就可以放在runnable中,例如賣票系統
* 如下例
*/
// public static void main(String[] args) {
//
// Ticket ticket = new Ticket();
// new Thread(ticket).start();
// new Thread(ticket).start();
//
// }
//
//}
// class Ticket implements Runnable{
//
// private int ticketNum = 100;
// public void run() {
//
// while(true){
// ticketNum --;
// System.out.println("the rest of ticket num is : " + ticketNum);
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
//// TODO Auto-generated catch block
// e.printStackTrace();
// }
// if(ticketNum<1){
// break;
// }
// }
//
//
// }
/*
* 如果每個線程執行的代碼不一樣,比如一個(run方法)要求加上1,一個(run方法)要求減去1
* 這就要有兩個run方法,也就是有兩個Runnable
* 如下例
*/
// public static void main(String[] args){
// final NumTest numTest = new NumTest();
// new Thread(new Runnable() {
//
// @Override
// public void run() {
// numTest.increment();
//
// }
// }).start();
// new Thread(new Runnable() {
//
// @Override
// public void run() {
// numTest.decrement();
// }
// }).start();
// }
// }
//
// class NumTest{
// private int num = 6;
// public void increment(){
// while(true){
// num++;
// System.out.println(num);
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
//// TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// }
// public void decrement(){
// while(true){
// num--;
// System.out.println(num);
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
//// TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// }
/*
* 上面的例子是把需求體現了,但是有些復雜,優化后的實例如下
* 這就是實現了把共享數據num及其方法封裝在另外的一個對象NumTest中,
* 然后把這個對象逐一傳遞給各個runnable對象,
* 這樣的好處是容易實現對該數據進行各個數據操作之間的互斥和通信
*/
// public static void main(String[] args) {
// final NumTest numTest = new NumTest();
// new Thread(new IncrementRunnable(numTest)).start();
// new Thread(new DecrementRunnable(numTest)).start();
// }
//}
// class IncrementRunnable implements Runnable{
// private NumTest numTest;
// public IncrementRunnable(NumTest numTest) {
// this.numTest = numTest;
// }
// public void run() {
// numTest.increment();
// }
// }
// class DecrementRunnable implements Runnable{
// private NumTest numTest;
// public DecrementRunnable(NumTest numTest){
// this.numTest = numTest;
// }
// public void run() {
// numTest.decrement();
// }
// }
// class NumTest{
// private int num = 6;
// public void increment(){
// num ++;
// System.out.println(num);
// }
// public void decrement(){
// num --;
// System.out.println(num);
// }
// }
}
/*
* 將runnable對象作為一個類的內部類,共享數據作為這個外部的類的成員變量,
* 每個線程對共享數據的操作方法也分配給外部類,
* 作為外部類的各個runnable對象調用調用外部類的這些方法
* 這也能很好的是想互斥和通信
* (這和上例的第一種情況幾乎相似,就是成員變量和局部變量的區別)
*/
//java提供Atomic類能幫助我們解決一些多線程共享數據的問題,詳情查看文檔
/**
* 多線程之間的共享數據的方式
*/
/*
* 如果每個線程執行的代碼一樣,可以使用同一個runnable對象,這個共享數據就可以放在runnable中,例如賣票系統
* 如下例
*/
// public static void main(String[] args) {
//
// Ticket ticket = new Ticket();
// new Thread(ticket).start();
// new Thread(ticket).start();
//
// }
//
//}
// class Ticket implements Runnable{
//
// private int ticketNum = 100;
// public void run() {
//
// while(true){
// ticketNum --;
// System.out.println("the rest of ticket num is : " + ticketNum);
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
//// TODO Auto-generated catch block
// e.printStackTrace();
// }
// if(ticketNum<1){
// break;
// }
// }
//
//
// }
/*
* 如果每個線程執行的代碼不一樣,比如一個(run方法)要求加上1,一個(run方法)要求減去1
* 這就要有兩個run方法,也就是有兩個Runnable
* 如下例
*/
// public static void main(String[] args){
// final NumTest numTest = new NumTest();
// new Thread(new Runnable() {
//
// @Override
// public void run() {
// numTest.increment();
//
// }
// }).start();
// new Thread(new Runnable() {
//
// @Override
// public void run() {
// numTest.decrement();
// }
// }).start();
// }
// }
//
// class NumTest{
// private int num = 6;
// public void increment(){
// while(true){
// num++;
// System.out.println(num);
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
//// TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// }
// public void decrement(){
// while(true){
// num--;
// System.out.println(num);
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
//// TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// }
/*
* 上面的例子是把需求體現了,但是有些復雜,優化后的實例如下
* 這就是實現了把共享數據num及其方法封裝在另外的一個對象NumTest中,
* 然后把這個對象逐一傳遞給各個runnable對象,
* 這樣的好處是容易實現對該數據進行各個數據操作之間的互斥和通信
*/
// public static void main(String[] args) {
// final NumTest numTest = new NumTest();
// new Thread(new IncrementRunnable(numTest)).start();
// new Thread(new DecrementRunnable(numTest)).start();
// }
//}
// class IncrementRunnable implements Runnable{
// private NumTest numTest;
// public IncrementRunnable(NumTest numTest) {
// this.numTest = numTest;
// }
// public void run() {
// numTest.increment();
// }
// }
// class DecrementRunnable implements Runnable{
// private NumTest numTest;
// public DecrementRunnable(NumTest numTest){
// this.numTest = numTest;
// }
// public void run() {
// numTest.decrement();
// }
// }
// class NumTest{
// private int num = 6;
// public void increment(){
// num ++;
// System.out.println(num);
// }
// public void decrement(){
// num --;
// System.out.println(num);
// }
// }
}
/*
* 將runnable對象作為一個類的內部類,共享數據作為這個外部的類的成員變量,
* 每個線程對共享數據的操作方法也分配給外部類,
* 作為外部類的各個runnable對象調用調用外部類的這些方法
* 這也能很好的是想互斥和通信
* (這和上例的第一種情況幾乎相似,就是成員變量和局部變量的區別)
*/
//java提供Atomic類能幫助我們解決一些多線程共享數據的問題,詳情查看文檔
?
轉載于:https://www.cnblogs.com/1350995917ding/archive/2011/09/23/2185999.html
總結
以上是生活随笔為你收集整理的线程之线程共享成员变量的几种情况的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EditText获得焦点后,如何关闭软键
- 下一篇: 应聘时漂亮的回答