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()
- a线程做完了,wait()下班,下班前喊一下notify()
- b线程听到了,上班,到点了wait()下班,下班前再喊一下notify()
- 这里面的上下班时间点由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的区别:
- sleep方法必须要有参数,参数就是睡觉的时间,时间到了自动醒来
wait方法可以传参也可以不传参,传参就是参数时间结束后醒来,不传参就是继续睡觉 - sleep方法在同步函数或同步代码块中,不释放锁
wait方法在同步函数或同步代码块中,释放锁