java 关于线程的问题
2. 如何创建线程对象(两种方式) 展开
2013-12-28
作用:
sleep():Thread类方法,用来控制自身流程。
wait():Object类方法,调用此方法时,被调对象进入等待状态,直到被唤醒或等待时间到。
notify():唤醒一个正在等待该对象的线程。
notifyAll():唤醒所有正在等待该对象的线程。
异常:
wait(),notify():java.lang.IllegalMonitorStateException。
wait(),sleep():InterruptedException。
创建线程:
1 通过扩展Thread类来创建多线程
public class MutliThreadDemo {
public static void main(String [] args){
MutliThread m1=new MutliThread("Window 1");
MutliThread m2=new MutliThread("Window 2");
MutliThread m3=new MutliThread("Window 3");
m1.start();
m2.start();
m3.start();
}
}
class MutliThread extends Thread{
private int ticket=100;//每个线程都拥有100张票
MutliThread(String name){
super(name);//调用父类带参数的构造方法
}
public void run(){
while(ticket>0){
System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());
}
}
}
2 通过实现Runnable接口来创建多线程
public class MutliThreadDemo2 {
public static void main(String [] args){
MutliThread m1=new MutliThread("Window 1");
MutliThread m2=new MutliThread("Window 2");
MutliThread m3=new MutliThread("Window 3");
Thread t1=new Thread(m1);
Thread t2=new Thread(m2);
Thread t3=new Thread(m3);
t1.start();
t2.start();
t3.start();
}
}
class MutliThread implements Runnable{
private int ticket=100;//每个线程都拥有100张票
private String name;
MutliThread(String name){
this.name=name;
}
public void run(){
while(ticket>0){
System.out.println(ticket--+" is saled by "+name);
}
}
}
static void sleep(long millis)
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
抛出:
InterruptedException
- 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态被清除。
static void sleep(long millis, int nanos)
在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
抛出:
IllegalArgumentException
- 如果 millis 值为负或 nanos 值不在 0-999999 范围内。
InterruptedException
- 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。
void wait()
在其他线程调用此对象的 notify() 方法或 notifyAll()
方法前,导致当前线程等待。
抛出:
IllegalMonitorStateException
- 如果当前线程不是此对象监视器的所有者。
InterruptedException
- 如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态 被清除。
void wait(long timeout)
在其他线程调用此对象的 notify() 方法或 notifyAll()
方法,或者超过指定的时间量前,导致当前线程等待。
抛出:
IllegalArgumentException
- 如果超时值为负。
IllegalMonitorStateException
- 如果当前线程不是此对象监视器的所有者。
InterruptedException
- 如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态 被清除。
void wait(long timeout,
int nanos) 在其他线程调用此对象的 notify() 方法或 notifyAll()
方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。
抛出:
IllegalArgumentException
- 如果超时值是负数,或者毫微秒值不在 0-999999 范围内。
IllegalMonitorStateException
- 如果当前线程不是此对象监视器的所有者。
InterruptedException
- 如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态 被清除。
void notify()
唤醒在此对象监视器上等待的单个线程。
抛出:
IllegalMonitorStateException
- 如果当前线程不是此对象监视器的所有者。
void notifuAll()
唤醒在此对象监视器上等待的所有线程。
抛出:
IllegalMonitorStateException
- 如果当前线程不是此对象监视器的所有者。
--------------------------
创建线程的2种方法,摘自本人的Java笔记
1、继承Thread类,然后重载方法run()。
例:
class CustomThread extends Thread { run() { /*thread code here*/ }}
CustomThread thread1 = new CustomThread();
thread1.start();
用start()来启动此线程,线程将执行run()一次然后被杀死。
这种方法写起来比较简单,但是新类不能再继承其他的类。
2、实现Runnable接口,然后用这个类创建Thread类对象。
例:
class CustomThread implements Runnable { run() {/*thread code here*/ }}
Thread thread1 = new Thread(new CustomThread());
thread1.start();
这种略抽象略麻烦,但新类可以再继承另外的类。
如何创建线程对象(两种方式)
创建一个类,继承Thread类,并重写run()方法(你所要实现的代码)。
创建一个类,实现Runnable接口,并重写run()方法(你所要实现的代码)。
wait()、notify()、notifyAll() 都是继承者Object类的方法,然而sleep()是继承自线程类的一个方法。
sleep():
public static void sleep(long millis)
throws InterruptedException
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。
notify():
public final void notify()
唤醒在此对象监视器上等待的单个线程。(可能抛出的异常类 IllegalMonitorStateException)
notifyAll():
public final void notifyAll()
唤醒在此对象监视器上等待的所有线程。(可能抛出的异常类 IllegalMonitorStateException)
wait() :
public final void wait()
throws InterruptedException
或者 public final void wait(long timeout, int nanos)throws InterruptedException
在其他线程调用此对象的 notify() 方法或 notifyAll()
方法前,导致当前线程等待。换句话说,此方法的行为就好像它仅执行 wait(0) 调用一样。