?? threadlocaltest.java
字號:
/**
* Description:
* <br/>Copyright (C), 2008-2010, Yeeku.H.Lee
* <br/>This program is protected by copyright laws.
* <br/>Program Name:
* <br/>Date:
* @author Yeeku.H.Lee kongyeeku@163.com
* @version 1.0
*/
class Account
{
/*定義一個ThreadLocal類型的變量,該變量將是一個線程局部變量
每個線程都會保留該變量的一個副本*/
private ThreadLocal<String> name =
new ThreadLocal<String>();
//定義一個初始化name屬性的構造器
public Account(String name)
{
this.name.set(name);
//下面代碼看到輸出“初始名”
System.out.println("------" + this.name.get());
}
//定義了name屬性的setter和getter方法
public String getName()
{
return name.get();
}
public void setName(String str)
{
this.name.set(str);
}
}
class MyTest extends Thread
{
//定義一個Account屬性
private Account account;
public MyTest(Account account, String name)
{
super(name);
this.account = account;
}
public void run()
{
//循環10次
for (int i = 0 ; i < 10 ; i++)
{
//當i == 6時輸出將賬戶名替換成當前線程名
if (i == 6)
{
account.setName(getName());
}
//輸出同一個賬戶的賬戶名和循環變量
System.out.println(account.getName()
+ " 賬戶的i值:" + i);
}
}
}
public class ThreadLocalTest
{
public static void main(String[] args)
{
//啟動兩條線程,兩條線程共享同一個Account
Account at = new Account("初始名");
/*
雖然兩條線程共享同一個賬戶,即只有一個賬戶名
但由于賬戶名是ThreadLocal類型的,所以兩條線程將
導致有同一個Account,但有兩個賬戶名的副本,每條線程
都完全擁有各自的賬戶名副本,所以從i == 6之后,將看到兩條
線程訪問同一個賬戶時看到不同的賬戶名。
*/
new MyTest(at , "線程甲").start();
new MyTest(at , "線程乙").start();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -