java多线程(四)

停止线程

stop方法已经过时。

如何停止线程?
    只有一种,run方法结束。
    开启多线程运行,运行代码通常是循环结构。
    只要控制住循环,就可以让run方法结束,也就是线程结束。(设置标记,让标记对外展示)

/*
 * 
 stop方法已经过时。

    如何停止线程?
	只有一种,run方法结束。
	开启多线程运行,运行代码通常是循环结构。
	
	只要控制住循环,就可以让run方法结束,也就是线程结束。
 * */
class StopThread implements Runnable
{
	private boolean flag =true;
	public  void run()
	{
		while(flag)
		{	
			System.out.println(Thread.currentThread().getName()+"....run");
		}
	}
	public void changeFlag()
	{
		flag = false;
	}
}

class  StopThreadDemo
{
	public static void main(String[] args) 
	{
		StopThread st = new StopThread();
		
		Thread t1 = new Thread(st);
		Thread t2 = new Thread(st);

		t1.start();
		t2.start();

		int num = 0;

		while(true)
		{
			if(num++ == 60)
			{
				st.changeFlag();
				break;
			}
			System.out.println(Thread.currentThread().getName()+"......."+num);
		}
		System.out.println("over");
	}
}


特殊情况:
当线程处于了冻结状态(wait,sleep,join)。就不会读取到标记。那么线程就不会结束。

当没有指定的方式让冻结的线程恢复到运行状态是,这时需要对冻结进行清除。
强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。

Thread类提供该方法 interrupt();

如果线程在调用 Object 类的 wait()wait(long)wait(long, int) 方法,或者该类的 join()join(long)join(long, int)sleep(long)sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException


class StopThread implements Runnable
{
	private boolean flag =true;
	public synchronized void run()
	{
		while(flag)
		{
			try {
				this.wait();  // 当线程1进来时,处于等待状态;当线程2进来时,也处于等待状态,这时程序就无法结束。
			} catch (InterruptedException e) {
				System.out.println(Thread.currentThread().getName()+"---"+e);
				flag = false;  // 设置标记为false
			}
			System.out.println(Thread.currentThread().getName()+"....run");
		}
	}
	public void changeFlag()
	{
		flag = false;
	}
}

class  StopThreadDemo
{
	public static void main(String[] args) 
	{
		StopThread st = new StopThread();
		
		Thread t1 = new Thread(st);
		Thread t2 = new Thread(st);

		t1.start();
		t2.start();

		int num = 0;

		while(true)
		{
			if(num++ == 60)
			{
				t1.interrupt(); // 中断t1线程,让他恢复到运行状态
				t2.interrupt(); // 中断t2线程
				
				break;
			}
			System.out.println(Thread.currentThread().getName()+"......."+num);
		}
		System.out.println(Thread.currentThread().getName()+"---over");
	}
}

守护线程(后台线程)

将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。

该方法必须在启动线程前调用。(主线程结束,守护线程必然结束)。


class StopThread implements Runnable
{
	private boolean flag =true;
	public synchronized void run()
	{
		while(flag)
		{
			System.out.println(Thread.currentThread().getName()+"....run");
		}
	}
	public void changeFlag()
	{
		flag = false;
	}
}

class  StopThreadDemo
{
	public static void main(String[] args) 
	{
		StopThread st = new StopThread();
		
		Thread t1 = new Thread(st);
		Thread t2 = new Thread(st);

		t1.setDaemon(true);  // 设置守护线程(随着主线程的结束而结束),必须在线程开启前设置
		t2.setDaemon(true);  // 设置守护线程
		
		t1.start();
		t2.start();

		int num = 0;

		while(true)
		{
			if(num++ == 60)
			{
				break;
			}
			System.out.println(Thread.currentThread().getName()+"......."+num);
		}
		System.out.println(Thread.currentThread().getName()+"---over");
	}
}

join(等待该线程终止。)

/*
join:
当A线程执行到了B线程的.join()方法时,A就会等待。等B线程都执行完,A才会执行。

join可以用来临时加入线程执行。
*/
class Demo implements Runnable{
	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {
			System.out.println(Thread.currentThread().getName()+"--->"+i);
		}
	}
}
public class JoinDemo {

	public static void main(String[] args) throws InterruptedException {
		Demo demo = new Demo();
		Thread t1 = new Thread(demo);
		Thread t2 = new Thread(demo);
	
		t1.start();
//		t1.join();  // 等待t1线程执行完成	(主线执行到此处,释放自己的cpu执行权,处于等待状态,当t1执行完毕,主线程被唤醒继续执行)
		t2.start();
//		t1.join();  // t1,t2交替执行,等待t1,t2执行完成,唤醒主线程执行。
		for (int i = 0; i < 10; i++) {
			System.out.println(Thread.currentThread().getName()+"--------->"+i);
		}
	}

}

线程优先级及yield()

toString() 返回该线程的字符串表示形式,包括线程名称、优先级和线程组。  //最大优先级10

setPriority(num);  设置线程优先级
    static int MAX_PRIORITY 
              线程可以具有的最高优先级。 
    static int MIN_PRIORITY 
              线程可以具有的最低优先级。 
    static int NORM_PRIORITY 
              分配给线程的默认优先级。 
              
yield()   暂停当前正在执行的线程对象,并执行其他线程。     

/*
toString() 返回该线程的字符串表示形式,包括线程名称、优先级和线程组。  //最大优先级10

setPriority(num);  设置线程优先级
	static int MAX_PRIORITY 
	          线程可以具有的最高优先级。 
	static int MIN_PRIORITY 
	          线程可以具有的最低优先级。 
	static int NORM_PRIORITY 
	          分配给线程的默认优先级。 
	          
yield()   暂停当前正在执行的线程对象,并执行其他线程。	          

 */
class Demo1 implements Runnable{
	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {
			System.out.println(Thread.currentThread().toString()+"--->"+i);
			// Thread[Thread-1,5,main]--->19
			Thread.yield();  //会出现执行一下线程1,执行一下线程2,交替执行
		}
	}
}
public class ThreadPriority {
	public static void main(String[] args) throws InterruptedException {
		Demo1 demo = new Demo1();
		Thread t1 = new Thread(demo);
		Thread t2 = new Thread(demo);
	
		t1.start();
		t1.setPriority(Thread.MAX_PRIORITY);  // t1.setPriority(10); 将t1的优先级设置为10
		
		t2.start();
		for (int i = 0; i < 10; i++) {
			System.out.println(Thread.currentThread().getName()+"--------->"+i);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值