Box.java
public class Box {
privateList<String> list=new ArrayList<String>();
privateObject obj=new Object();
publicvoid addString(String str){
//token
synchronized(obj){
list.add(str);
}
}
publicsynchronized void removeString(String str){
list.remove(str);
}
}
BoxMain.java
public class BoxMain {
publicstatic void main(String[] args) {
finalBox box=new Box();
Threadt=new Thread(){
publicvoid run(){
for(inti=0;i<100;i++){
box.addString("thread");//匿名的成员变量要使用final
}
}
};
t.start();
for(inti=0;i<100;i++){
box.addString("mian"+i);
}
}
}
Counter.java
import java.util.Scanner;
public class Counter {
privateStringBuffer buffer=new StringBuffer();
publicvoid action(){
PrintThreadthread=new PrintThread();
thread.setDaemon(true);//设置该线程是否为守护线程
//当JVM发现当前所有的线程都是守护线程的时候就自动退出
thread.start();
Scannerscanner= new Scanner(System.in);
Stringstr;
while((str=scanner.next())!=null){
if("exit".equals(str)){
break;
}
buffer.append(str);
}
}
publicstatic void main(String[] args){
Countercounter=new Counter();
counter.action();
}
privateclass PrintThread extends Thread{
publicvoid run(){
while(true){
System.out.println(buffer);
try{
Thread.sleep(5000);
}catch (InterruptedException e) {
}
}
}
}
}
进程process
线程thread
线程状态:就绪<-->运行-->阻塞 结束
/| \ |
---------------
方法:
getPriority()获得优先级 优先级只能往低改不可往高改
run()
setPriority()
yield()
Thread.currentThread()
Thread.sleep(1000);
线程安全的类:两个以上的线程同时访问该类的一个对象,
不会有线程同步的问题:1)不可改变的类:例如:String 所有的包装类
2)可变类,但是synchornized StringBuffer Vector Hashtable
线程不安全的类 StringBuilder ArrayList HashMap