Java操作线程的方法

一、线程的休眠

一种能控制线程的方法是调用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时间片执行。

发布了61 篇原创文章 · 获赞 1 · 访问量 1315

猜你喜欢

转载自blog.csdn.net/qq_29440983/article/details/104478612