一、线程的休眠
一种能控制线程的方法是调用sleep()方法,sleep()方法需要一个参数用于指定该线程休眠的时间,该时间以毫秒为单位。sleep()方法的语法如下:
try{
Thread.sleep(2000);
}catch(InterruptedException e){
e.printStackTrace();
}
从上述代码可以看出线程在2秒之内不会进入就绪状态。虽然使用了sleep(0方法的线程在一段时间内会醒来,但是并不能保证它醒来后进入运行状态,只能保证它进入就绪状态。
通过下列实例使读者更深入地了解线程的休眠方法:
package test;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JFrame;
public class SleepMethodTest extends JFrame{
private Thread t;
private static Color[] color = {Color.BLACK,Color.CYAN,Color.BLUE,
Color.GREEN,Color.ORANGE,Color.YELLOW,Color.RED,Color.PINK
,Color.LIGHT_GRAY};
private static final Random rand = new Random();
private static Color getC() {
return color[rand.nextInt(color.length)];
}
public SleepMethodTest() {
t = new Thread(new Runnable() {
int x = 30;
int y = 50;
@Override
public void run() {
// TODO 自动生成的方法存根
while(true) {
try {
Thread.sleep(100);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
Graphics grap = getGraphics();
grap.setColor(getC());
grap.drawLine(x, y, 100, y++);
if(y>=80) {
y = 50;
}
}
}
});
t.start();
}
public static void main(String args[]) {
init(new SleepMethodTest(),100,100);
}
public static void init(JFrame frame,int width,int height) {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(width,height);
frame.setVisible(true);
}
}
运行结果截图如下:
二、线程的加入
如果当前某线程为多线程程序,假如存在一个线程A,现在需要插入线程B,并要求线程B先执行完毕,然后在执行线程A,这时可以使用Thread类种的join()方法来完成。
当某个线程使用join()方法加入到另一个线程时,另一个线程会等待该线程执行完毕后再继续执行。
通过如下实例来了解join()方法:
package test;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
public class JoinTest extends JFrame{
private Thread threadA;
private Thread threadB;
final JProgressBar pb1 = new JProgressBar();
final JProgressBar pb2 = new JProgressBar();
int count = 0;
public static void main(String args[]) {
init(new JoinTest(),100,100);
}
public JoinTest() {
super();
getContentPane().add(pb1,BorderLayout.NORTH);
getContentPane().add(pb2,BorderLayout.SOUTH);
pb1.setStringPainted(true);
pb2.setStringPainted(true);
threadA = new Thread(new Runnable() {
int count = 0;
@Override
public void run() {
// TODO 自动生成的方法存根
while(true) {
pb1.setValue(++count);
try {
Thread.sleep(100);
threadB.join();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
});
threadA.start();
threadB = new Thread(new Runnable() {
int count = 0;
@Override
public void run() {
// TODO 自动生成的方法存根
while(true) {
pb2.setValue(++count);
try {
Thread.sleep(100);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
if(count == 100) {
break;
}
}
}
});
threadB.start();
}
public static void init(JFrame frame,int w,int h) {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(w,h);
frame.setVisible(true);
}
}
运行结果截图如下:
三、线程的中断
现在在Java种提倡在run()方法种使用无限循环的形式,然后使用一个布尔型标记控制循环的停止。
通过以下实例来进行说明:
package test;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
public class InterruptedSwing extends JFrame{
Thread thread;
public static void main(String args[]) {
init(new InterruptedSwing(),100,100);
}
public InterruptedSwing() {
super();
final JProgressBar pb = new JProgressBar();
getContentPane().add(pb,BorderLayout.NORTH);
pb.setStringPainted(true);
thread = new Thread(new Runnable() {
int count = 0;
@Override
public void run() {
// TODO 自动生成的方法存根
while(true) {
pb.setValue(++count);
try {
thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
System.out.println("当前线程被中断!");
break;
}
}
}
});
thread.start();
thread.interrupt();
}
public static void init(JFrame frame,int w,int h) {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(w,h);
frame.setVisible(true);
}
}
运行结果如下:
四、线程的礼让
Thread类提供了一种礼让方法,使用yield()方法表示,它只是给当前正处于运行状态下的线程一个提醒,告知它可以将资源礼让给其他线程,但这仅是一种暗示,没有任何一种机制保证当前线程会将资源礼让。
yield()方法使具有同样优先级的线程有进入可执行状态的计划,当当前线程放弃执行权时会再度回到就绪状态。对于支持多任务的操作系统来说,不需要调用yield()方法,因为操作系统会为线程自动分配CPU时间片执行。