`

后台线程

阅读更多
java中与线程相关的一些函数:
yield,是Thread的静态方法,让出cpu给其他线程执行。
sleep,是Thread的静态方法,让线程休眠一段时间,但时间过后,不一定立即进入运行状态。
join,是Thread类的成员方法,当调用t.join()时,保证t先执行完,再执行当前线程。
package test;

class MyThread  extends Thread{
	public MyThread(){
		this.setDaemon(true);//在启动线程前设置为后台线程,
		this.start();
	}
	
	public void run(){
		while(true){
				try {
					sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(this);
		
		}
	}
}

public class DaemonTest {

	public static void main(String[] args) {

		for(int i=0;i<10;i++)
		new MyThread();
	}
}

执行结果:没有输出结果,因为在run里面,线程先sleep了100毫秒,一旦所有线程都启动了,当线程要打印信息之前程序已经终止。当main线程结束,整个程序就结束了,而不管后台线程的状态。即只要没有非后台线程在运行,程序就结束。后台线程是提供服务的。
一个后台线程,又叫守护线程,所创建的线程都是后台线程。如,在一个后台线程的run方法中创建新的线程,无需设置this.setDaemon(true);新线程就是后台线程。

线程同步的问题:
package thread;

public class AlwaysEven {

	private int i;
	public void next(){
		i++;i++;
	}
	
	public int getValue(){ //返回偶数
		return i;
	}
	
	
	public static void main(String[] args) {

		final AlwaysEven ae = new AlwaysEven(); //必须是final,因为它被匿名内部类访问
		
		
		new Thread("watcher"){ //匿名内部类
			
			public void run(){
				while(true){
					int val = ae.getValue();
					if(val%2!=0)System.out.println(val);  //watcher线程判断是否是偶数,
					System.exit(0);
				}
				
				
			}
		}.start();//匿名线程
		
		while(true){
			ae.next(); //主线程返回下一个偶数
		}
	}

}
有何问题?没有输出???
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics