java线程控制的语法很多 这里我们主要说以下三个方法
我们先新建一个包
包下建立两个类
customException 线程类
参考代码如下
public class customException extends Thread {
public String name;
public customException(){
}
public void run(){
for(int i = 0;i < 100;i++){
System.out.println(getName()+"第"+(i + 1)+"次输出");
}
}
}
text 测试类
参考代码如下
public class text {
public static void main(String args[]) {
customException com1 = new customException();
customException com2 = new customException();
customException com3 = new customException();
com1.setName("刘备");
com2.setName("孙权");
com3.setName("曹操");
com1.start();
com2.start();
com3.start();
}
}
然后 我们运行代码
我们可以看到 曹操既然没有干过刘备和孙权
把记录往上翻
我们看到 刚开始 我们的孙权也是非常的给力 但再执行一次 你会发现 他们谁快谁慢 完全是随机的
但按照历史 孙权和刘备应该要慢一些
我们改写 customException 类中的 run方法如下
public class customException extends Thread {
public String name;
public customException(){
}
public void run(){
for(int i = 0;i < 100;i++){
if(getName() == "孙权"||getName() == "刘备") {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(getName()+"第"+(i + 1)+"次输出");
}
}
}
这里我们取getName方法 就是获取当前的线程名称 判断 如果是 孙权或刘备 则 执行Thread中的sleep 里面是休眠的时间数
这样 每次孙权和刘备的线程执行时 都会先休眠一秒
我们运行代码如下
这里我们可以看到 曹操都跑完了 孙权和刘备总共也没执行几次 甚至才刚开始
因为他们每次执行都会先休眠一秒 而在计算机中 一秒可以做非常非常多的事
这就是sleep线程休眠的语法
我们去customException类中
把刚写的休眠代码去掉
然后我们改一下测试类的线程名称
康熙 四阿哥 八阿哥
这是一场皇位争夺战 但他们如果一起执行 谁快谁慢都不好说
但康熙是他们的父亲 啊 要等康熙挂了 他们才能开始抢啊
我们修改测试类main方法如下
public static void main(String args[]) {
customException com1 = new customException();
customException com2 = new customException();
customException com3 = new customException();
com1.setName("康熙");
com2.setName("四阿哥");
com3.setName("八阿哥");
com1.start();
try {
com1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
com2.start();
com3.start();
}
join方法就会强行控制 com1线程走完之后 其他线程才能继续执行
这就是第二个语法 强行 指定某个线程执行完毕 其他线程才能接着往下走
然后我们更改 customException 线程类的代码如下
public class customException extends Thread {
public String name;
public int age;
public customException(int age){
this.age = age;
}
public void run(){
for(int i = 0;i < age;i++){
System.out.println(getName()+"第"+(i + 1)+"次输出");
}
}
}
text测试类 代码如下
public class text {
public static void main(String args[]) {
customException com1 = new customException(10);
customException com2 = new customException(100);
customException com3 = new customException(100);
com1.setName("总统");
com2.setName("保镖");
com3.setName("助理");
com1.start();
com2.start();
com3.start();
}
}
这是可以看到 我们将线程的次数 改成了 用age变量控制 而这个变量是customException构造函数中控制的
而我们总统传了 10 保镖和助理传了一百
执行之后 理所当然 总统执行了10次 但其他两个执行了 100次
但总统退休了 他们也就改退休了啊
我们这里改写text类中的main方法
public static void main(String args[]) {
customException com1 = new customException(10);
customException com2 = new customException(100);
customException com3 = new customException(100);
com1.setName("总统");
com2.setName("保镖");
com3.setName("助理");
com1.start();
com2.setDaemon(true);
com3.setDaemon(true);
com2.start();
com3.start();
}
这是 我们将 com2和com3 都设置成立守卫线程 主线程结束之后 他们也会结束 我们运行代码
我们可以看到 保镖和助理执行了十几次也停了 因为主线程已经结束了
有些人就会说 主线程结束 他们不应该立马结束吗?
主线程结束 守卫线程还有一点反应时间才结束
这样总统退休 保镖和助理也就光荣下岗啦