一.线程,一个程序内部的一条执行线索,一程序中实现多段代码同时交替运行就需要产生多个线程,并制定每个线程上 所
要运行 的 程序代码,这就是多线程。
单线程:
class TestThread {
public void run(){
while(true){
// Thread.currentThread()返回线程执行类对象
System.out.println(“run(): ”+Thread.currentThread().getName());
}
}
}
class Test{
public static void main(String[] args){
new TestThread().run();
while(true){
system.out.println(“main(): ”+Thread.currentThread().getName());
}
}
}
多线程:class TestThread extends Thread{
public void run(){
while(true){
// Thread.currentThread()返回线程执行类对象
System.out.println(“run(): ”+Thread.currentThread().getName());
}
}
}
class Test{
public static void main(String[] args){
//在启动之前(调用start()方法前)调用setDaemon(true)方法线程变为后台线程,
//只要有一个前台线程在运行,进程就不会结束,后台线程在执行,进程就会结束
//pp.join()合并线程到调用该方法的语句中,成为单线程。
new TestThread().start();//启动线程并调用Thread的run()方法
while(true){
system.out.println(“main(): ”+Thread.currentThread().getName());
}
}
}
二.Runnable中的run和Thread的run方法的区别
(1). sonThread extends Thread{ public void run(){//}}
new sonThread().start();
(2).sonThread implment Runnable{ public void run(){//}}
new Thread(new sonThreaad()).start();
就Thread而言,对于100张票,new Thread().start();
new Thread().start();
这两线程各自独立的销售这100张票,可能会同时买同一张票.
解决方法:sonThread tt=new sonThread();
tt.start();
tt.start();
而就Runnable而言,sonThread tt=new sonThread();
new Thread(tt).start();
new Thread(tt).start();
这两线程共同销售这100张票。
三.线程等待和唤醒
Thread t->
Synchronized(o) 线程t得到对象o的锁旗标
o.wait()-> 线程t被放置在对像o的等待线池中,t自动释放o的锁旗标
o.notify() 当另外的线程执行了对象o的 notify()方法后,线程t可能会被从o的等待线程池中释放出来并且
移动到等待线程对象o的 锁旗标的线程池中,当t得到锁旗标时就会执行下去。
wait() 告诉当前线程放弃监视器并进入睡眠状态直到其他线程进入同一监视器并调用 notify()为止。
notify() 唤醒同一对象监视器中调用wait()的第一个线程,类似让第一个排队人进去吃饭。
notifyAll() 唤醒同一对象监视器中调用wait()的所有线程(按优先级)
四.线程的生命控制
线程在建立后并不马上执行run方法中的代码,而是处于等待状态。线程处于等待状态时,可以通过Thread类的方法
来设置线程 不各种属性,如线程的优先级(setPriority)、线程名(setName)和线程的类型(setDaemon)等。
当调用start方法后,线程开始执行run方法中的代码。线程进入运行状态。可以通过Thread类的isAlive方法来判断线程
是否处于 运行状态。当线程处于运行状态时,isAlive返回true,当isAlive返回false时,可能线程处于等待状态,也可能
处于停止状态。下面的代码演示了线程的创建、运行和停止三个状态之间的切换,并输出了相应的isAlive返回值。
statrt()---->Runnable?--scheduler--àRunning---àrun() completes
wait() and please lock-àBlocked in object’s wait pool---ànotify() or interrupt()-à
Running-àsynchronized-àBlocked in Object’lock pool--à得到对象锁旗标-à Runnable.