JAVA---多线程
java的线程是通过java.lang.Thread类来实现
VM启动时会有一个方法(public static void main(){})所定义的线程。
可以通过创建Thread的实例来创建新的线程。
每一个线程都是通过某个特定的Thread对象所对应的方法run()来完成其操作的,方法run()成为线程体。
通过调用Thread类中的start()方法来启动一个线程。
两种创建新线程的方式:
1:
定义线程实现Runnable接口
Thread myThread=new Thread(target); //target为Runnable接口类型
Runnable中只有一个方法:
public void run()://用以定义线程运行体。使用Runnable接口可以为多个线程提供共享的数据。
在实现Runnable接口的类runn方法定义中可以使用Thread的静态方法:
public static Thread currentThread();获取当前线程的引用。
第二种:
可以定义一个Thread的子类并重写其run方法如:
class extends Thread{
public void rMyThread run(){.....}
}
然后生成该类的对象:
MyThread myThread=new MyThread(....);
线程状态转换图:
方法/功能
isAlive();判断线程是否还“活“着,即线程是否还未终止。
getPriority();获取线程的优先级数值。
setPriority();设置线程的优先级数值
Thread.sleep();将当前线程睡眠指定毫秒数
join();调用某线程的方法,将当前线程与该线程合并,即等待该线程结束,再恢复当前线程的运营。
yield();让出CPu,当前线程进入就绪队列等待调度。
wait();当前线程进入对象的wait pool。
notify();唤醒对象的wait pool中的一个
notifyAll();所有等待线程
关键字synchronized来与对象的互斥锁联系。当某个对象synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。
synchronize的使用方法:
synchronized(this){
num++;
try{Thread.sleep(1);}
catch(InterruptedException e){ }
System.out.println("name+",你是第"+num+"个使用timer的线程");
}
ynchronized还可以放在方法声明中,表示整个方法为同步方法:
sybchronized public void add(String name){....}
1:wait()与sleep()方法的区别:
相同点:都可以让线程进入等待状态;
不同点:wait()只能放在锁里面,而sleep()可以任意地方调用此方法;wait()方法可以释放锁,而sleep()不可以;
2:notify()方法:
只能放在锁里面;它唤醒是第一个等待的线程(当然有时也可任意)
3:wait() 与notify()方法的结合:
一般步骤:
先建一个A类--》定义一个A类的对象a,然后把它当做B线程的构造方法形参,写run()方法,锁住对象a,给它一个wait()的方法,此时B线程处于等待状态,但锁被释放了。--》重复步骤2,在C线程的run方法中唤醒a,此时B线程后面的语句就可以输出。
A a=new A();
B b=new B(a);
C c=new C(a);
b.start();c.start();
5:注意事项:B线程和C线程那个先输出?为了避免其中一个线程后面的等待语句没有输出,最好用sleep()方法做一个先后。
4‘匿名类:
作用:节省代码量,方便,所提供的匿名类与匿名方法必须有关联,直接可以调用:
Thread t=new Thread(){
public void run(){
.........代码......
}
};
t.start();