javaSE (三十六)Runtime类、Timer类、两个线程之间的通信、三个及以上线程通信、sleep和wait的区别

1、Runtime类:
runtime类其实是单例模式(见上文)的一个体现,它的构造方法被私有化,可以在代码中输入命令字符串控制计算机

代码实例:

package cn.xinhua;

import java.io.IOException;

public class ThreadTest {

	public static void main(String[] args) throws IOException {
		
		Runtime r =  Runtime.getRuntime();
		r.exec("shutdown -s -t 300");
		r.exec("shutdown -a");
	}

}

输出:
"你的电脑将在五分钟后关机"
"撤销"

2、Timer类:

指定时间安排指定任务(指定时间重复)
这个data构造方法已经被弃用了,无法使用

package cn.xinhua;

import java.io.IOException;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class ThreadTest {

	public static void main(String[] args) throws IOException, InterruptedException {
		Timer t = new Timer();
		//在指定时间做指定的事
		t.schedule(new MyTimerTask(), new Date(118, 11, 12, 17, 39, 30));
		//循环计数,一秒打印一次时间
		while (true) {
			Thread.sleep(1000);
			System.out.println(new Date());
		}

	}

}

class MyTimerTask extends TimerTask {

	@Override
	public void run() {
		System.out.println("每天起床第一句,先给自己打个气!");

	}

}

3、两个线程之间的通信:

问题:因为多线程的并发是CPU随机切换的,让两个线程之间可以互相交流,比如,交叉进行一项任务,有点规律(不合规矩,不成方圆)

思路:这里用Object的两个方法: void wait() , void notify()

  1. a线程做完了,wait()下班,下班前喊一下notify()
  2. b线程听到了,上班,到点了wait()下班,下班前再喊一下notify()
  3. 这里面的上下班时间点由if语句设定

代码:

package cn.xinhua;

public class ThreadTest {

	public static void main(String[] args) {
		Print p = new Print();
		Thread t1 = new Thread() {
			public void run() {
				for (int i = 0; i < 1000; i++) {
					try {
						p.print1();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		};

		Thread t2 = new Thread() {
			public void run() {
				for (int i = 0; i < 1000; i++) {
					try {
						p.print2();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		};

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

	}

}

class Print extends Thread {
	private int target = 1;

	public void print1() throws InterruptedException {

		synchronized (ThreadTest.class) { // 加了个线程锁,不会再出现句子不全的问题了

			if (target == 2) {
				ThreadTest.class.wait();//下班
			}
			System.out.print("我");
			System.out.print("是");
			System.out.print("吴");
			System.out.print("彦");
			System.out.print("祖");
			System.out.println();
			target = 2;
			ThreadTest.class.notify();//喊一下
		}
	}

	public void print2() throws InterruptedException {
		synchronized (ThreadTest.class) {
			if (target == 1) {
				ThreadTest.class.wait();//下班
			}
			System.out.print("你");
			System.out.print("要");
			System.out.print("相");
			System.out.print("信");
			System.out.print("我");
			System.out.println();
			target = 1;
			ThreadTest.class.notify();//喊一下
		}
	}
}

输出:(a执行完b执行,轮换着)

我是吴彦祖
你要相信我
我是吴彦祖
你要相信我
。。。
我是吴彦祖
你要相信我
我是吴彦祖
你要相信我
我是吴彦祖
你要相信我
我是吴彦祖
你要相信我
。。。

4、三个及以上线程通信:

  • if 语句是从哪等待,就从哪起来,所以三个以上的线程就不行了,换成while语句
  • while语句是循环语句,每次都会判断,但是 notify() 只能叫醒一个人,所以要换成 nitifyAll()

4、sleep和wait的区别:

  1. sleep方法必须要有参数,参数就是睡觉的时间,时间到了自动醒来
    wait方法可以传参也可以不传参,传参就是参数时间结束后醒来,不传参就是继续睡觉
  2. sleep方法在同步函数或同步代码块中,不释放锁
    wait方法在同步函数或同步代码块中,释放锁
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值