1:继承thread和实现Runnable创建线程的区别:
继承thread创建的对象直接start()就可以就绪,但是使用Runnable所new出来的对象要先new Thread(xx)才能start()
这也就意味着在start()之前实现Runnable的类一次new 出来的对象是可以多次传入new Thread()创建多个线程实例并且多次start()的,就是说
runnable的数据可以被共享,但是继承thread创建的线程不具备这个功能。
classThread1 extends Thread{private int count=5;privateString name;publicThread1(String name) {this.name=name;
}public voidrun() {for (int i = 0; i < 5; i++) {
System.out.println(name + "运行 count=" + count--);try{
sleep((int) Math.random() * 10);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}public classMain {public static voidmain(String[] args) {
Thread1 mTh1=new Thread1("A");
Thread1 mTh2=new Thread1("B");
mTh1.start();
mTh2.start();
}
}
2:线程的状态:
|-阻塞- |
| |就绪-可运行-运行中-死亡| / |
| / |锁------等待
运行---可运行:thread.yield()
运行--等待:object.wait()
运行--阻塞:thread.sleep() thread.join()
运行--锁:synchronized
等待--锁:object.notify() 或者wait时间到
锁--可运行:
3:解析sleep() wait() yield()的区别:
sleep wait yield所属类: Thread Object Thread
目的: 运行到阻塞 运行到等待 运行到可运行或者立即重新运行
锁持有状态: 不释放 释放 释放
让出cpu资源后: 允许比自己优先级低的运行 只允许比自己优先级高或等的执行,也可能自己去执行
使用条件: 任何地方 必须在同步块或者方法中
4:常用方法
sleep(): 强迫一个线程睡眠N毫秒。
isAlive(): 判断一个线程是否存活。
join(): 等待线程终止。
activeCount(): 程序中活跃的线程数。
enumerate(): 枚举程序中的线程。
currentThread(): 得到当前线程。
isDaemon(): 一个线程是否为守护线程。
setDaemon(): 设置一个线程为守护线程。(用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束)
setName(): 为线程设置一个名称。
wait(): 强迫一个线程等待。
notify(): 通知一个线程继续运行。
setPriority(): 设置一个线程的优先级。
5:synchronized
a: Public synchronized void methodAAA()//修饰静态方法时锁对象是调用这个方法的对象
{//….
}
b:public void method3(SomeObject so)//修饰块时锁对象是括号中的对象
{
synchronized(so)
{//…..
}
}
c: Class Foo{public synchronized static void methodAAA() //同步的static 函数锁对象是当前类
{
}public voidmethodBBB()
{
synchronized(Foo.class) //等同于上面
}
}
6:经典例子
public classTest {public classmyThread implements Runnable{privateString threadName;privateObject pre;privateObject curr;publicmyThread(String n,Object p,Object c){this.threadName=n;this.pre=p;this.curr=c;
}public voidrun() {//TODO Auto-generated method stub
int i=10;while (i>0){
synchronized(pre){
synchronized(curr){
System.out.println(threadName);
i--;
curr.notify();//通知下一个对象获得锁
}try{
pre.wait();
}catch(InterruptedException e) {//TODO Auto-generated catch block
e.printStackTrace();
}//释放对pre对象持有的锁
}
}
}
}public static voidmain(String[] args){
Object a=newObject();
Object b=newObject();
Object c=newObject();
Test t=newTest();
myThread pa=t.new myThread("A",c,a);newThread(pa).start();
myThread pb=t.new myThread("B",a,b);newThread(pb).start();
myThread pc=t.new myThread("C",b,c);newThread(pc).start();
}
}