实现多线程程序的步骤:
1)将类声明为 Thread 的子类2)该子类应重写 Thread 类的 run 方法(run()方法里面应该是一些耗时的操作,IO操作/循环语句)
3)在主线程进行该自定义的线程类的对象的创建
注意:直接适用对象调用run方式时,算是普通方法的调用
Thread实现了Runnable接口
自定义类的程序示例
public class MyThread extends Thread {
public MyThread() {
}
public MyThread(String name) {
super(name) ;
}
@Override
public void run() {
……………………
}
}
}
测试类的程序示例
public static void main(String[] args) {
//执行线程不是run方法 ,run方法的调用相当于一个普通方法的调用
/*public void start()使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
结果是两个线程并发地运行*/
MyThread t1 = new MyThread() ;
t1.start();
MyThread t2 = new MyThread() ;
t2.start();
}
Thread的构造方法
public Thread()
分配新的 Thread 对象。
public Thread(String name)
分配新的 Thread 对象。
name - 新线程的名称。
Thread提供的一些方法
public void start()
使该线程开始执行;Java 虚拟机调用该线程的 run 方法。(如果一个线程被多次执行则会报错IllegalThreadStateException:非法状态异常,同一个线程只能被执行一次)
public final void setName(String name)
改变线程名称,使之与参数 name 相同。
name - 该线程的新名称。
public final String getName()
返回该线程的名称。
public static Thread currentThread()
返回对当前正在执行的线程对象的引用。(一般和getName一起使用,返回的就是当前执行的线程对象的名称)
public final void setDaemon(boolean on)
将该线程标记为守护线程或用户线程。(守护线程不会立即结束掉,它会执行一段时间在结束掉)
示例程序
public static void main(String[] args) {
//创建两个子线程
ThreadDaemon td1 = new ThreadDaemon() ;
ThreadDaemon td2 = new ThreadDaemon() ;
td1.setName("1");
td2.setName("2");
//在启动之前,设置为守护线程,守护的是主线程
td1.setDaemon(true);
td2.setDaemon(true);
td1.start();
td2.start();
Thread.currentThread().setName("3");
for(int x =0 ; x < 5 ; x ++) {
System.out.println(Thread.currentThread().getName()+":"+x);
} //主线程结束,1和2线程也随之结束,但是不会立即结束,会继续运行一小段时间
}
public final void setPriority(int newPriority)
更改线程的优先级(IllegalArgumentException - 如果优先级不在 MIN_PRIORITY 到 MAX_PRIORITY 范围内。)
public static final int MAX_PRIORITY 10 最大优先级
public static final int MIN_PRIORITY 1 最小优先级
public static final int NORM_PRIORITY 5 默认优先级
public final int getPriority()
返回线程的优先级。(默认为5,优先级越大被执行的概率越高)
public final void join() throws InterruptedException
等待该线程终止。 (这个线程执行完之后才会执行其他线程)
public static void yield()
暂停当前正在执行的线程对象,并执行其他线程。
public static void sleep(long millis) throws InterruptedException
线程睡眠【调用不会释放锁】(暂停执行)
millis - 以毫秒为单位的休眠时间。
public final void wait() throws InterruptedException
当前线程等待【调用立即释放锁】(继承Object类的方法)
public void interrupt()
中断线程。【中断状态设为true】 (通知线程应该中断了,具体到底中断还是继续运行,应该由被通知的线程自己处理。)
public static boolean interrupted()
测试当前线程是否已经中断。
程序示例:
Thread t1 = new Thread( new Runnable(){
public void run(){
// 若未发生中断,就正常执行任务
while(!Thread.currentThread.isInterrupted()){
// 正常任务代码……
}
// 中断的处理代码……
doSomething();
}
} ).start();
public final void stop()
强迫线程停止执行。【方法已过时】(强制停止)