java学习笔记 --- 多线程(多线程的控制)

时间:2025-03-04 15:37:20

1、线程休眠
      public static void sleep(long millis)

java学习笔记 --- 多线程(多线程的控制)
public class ThreadSleep extends Thread {
@Override
public void run() {
for (int x = 0; x < 100; x++) {
System.out.println(getName() + ":" + x + ",日期:" + new Date());
// 睡眠
// 困了,我稍微休息1秒钟
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} /*
* 线程休眠
* public static void sleep(long millis)
*/
public class ThreadSleepDemo {
public static void main(String[] args) {
ThreadSleep ts1 = new ThreadSleep();
ThreadSleep ts2 = new ThreadSleep();
ThreadSleep ts3 = new ThreadSleep(); ts1.setName("林青霞");
ts2.setName("林志玲");
ts3.setName("林志颖"); ts1.start();
ts2.start();
ts3.start();
}
}
java学习笔记 --- 多线程(多线程的控制)

2 、加入线程:加入进来的线程执行结束后才执行其他线程

    public final void join():等待该线程终止,才执行其他线程

java学习笔记 --- 多线程(多线程的控制)
public class ThreadJoin extends Thread {
@Override
public void run() {
for (int x = 0; x < 100; x++) {
System.out.println(getName() + ":" + x);
}
}
} /*
* public final void join():等待该线程终止。
*/
public class ThreadJoinDemo {
public static void main(String[] args) {
ThreadJoin tj1 = new ThreadJoin();
ThreadJoin tj2 = new ThreadJoin();
ThreadJoin tj3 = new ThreadJoin(); tj1.setName("李渊");
tj2.setName("李世民");
tj3.setName("李元霸");
//先执行完"李渊"在执行其他线程
tj1.start();
try {
tj1.join();
} catch (InterruptedException e) {
e.printStackTrace();
} tj2.start();
tj3.start();
}
}
java学习笔记 --- 多线程(多线程的控制)

3、礼让线程:暂停当前正在执行的线程对象,并执行其他线程。

  public static void yield():暂停当前正在执行的线程对象,并执行其他线程。 
            让多个线程的执行更和谐,但是不能靠它保证一人一次。

java学习笔记 --- 多线程(多线程的控制)
public class ThreadYield extends Thread {
@Override
public void run() {
for (int x = 0; x < 100; x++) {
System.out.println(getName() + ":" + x);
       //调用礼让线程方法
Thread.yield();
}
}
}
/*
* public static void yield():暂停当前正在执行的线程对象,并执行其他线程。
* 让多个线程的执行更和谐,但是不能靠它保证一人一次。
*/
public class ThreadYieldDemo {
public static void main(String[] args) {
ThreadYield ty1 = new ThreadYield();
ThreadYield ty2 = new ThreadYield(); ty1.setName("线程1");
ty2.setName("线程2"); ty1.start();
ty2.start();
}
}
java学习笔记 --- 多线程(多线程的控制)

4、后台线程(守护线程):主线程结束后,守护线程也会跟着终止

  public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。

  守护线程和一般线程的区别:

  1、守护线程就是main同生共死,当main退出,它将终止,而普通线程是在任务执行结束才停止。

  2、Java虚拟机在它所有非守护线程已经离开后自动离开。守护线程则是用来服务用户线程的,如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。

java学习笔记 --- 多线程(多线程的控制)
public class ThreadDaemon extends Thread {
@Override
public void run() {
for (int x = 0; x < 100; x++) {
System.out.println(getName() + ":" + x);
}
}
}
/*
* public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。
* 当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。
*
* 游戏:坦克大战。
*/
public class ThreadDaemonDemo {
public static void main(String[] args) {
ThreadDaemon td1 = new ThreadDaemon();
ThreadDaemon td2 = new ThreadDaemon(); td1.setName("关羽");
td2.setName("张飞"); // 设置收获线程
td1.setDaemon(true);
td2.setDaemon(true);
    //守护线程必须在线程启动前设置
td1.start();
td2.start(); Thread.currentThread().setName("刘备");
for (int x = 0; x < 5; x++) {
System.out.println(Thread.currentThread().getName() + ":" + x);
}
}
}
java学习笔记 --- 多线程(多线程的控制)

5、终止线程

  public final void stop():让线程停止,过时了,但是还可以使用。
    public void interrupt():中断线程。 把线程的状态终止,并抛出一个InterruptedException。

java学习笔记 --- 多线程(多线程的控制)
public class ThreadStop extends Thread {
@Override
public void run() {
System.out.println("开始执行:" + new Date()); // 我要休息10秒钟,亲,不要打扰我哦
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// e.printStackTrace();
System.out.println("线程被终止了");
} System.out.println("结束执行:" + new Date());
}
}
/*
* public final void stop():让线程停止,过时了,但是还可以使用。
* public void interrupt():中断线程。 把线程的状态终止,并抛出一个InterruptedException。
*/
public class ThreadStopDemo {
public static void main(String[] args) {
ThreadStop ts = new ThreadStop();
ts.start(); // 你超过三秒不醒过来,我就干死你
try {
Thread.sleep(3000);
// ts.stop();
ts.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
java学习笔记 --- 多线程(多线程的控制)

6、线程的优先级设置

    线程默认优先级是5。
    线程优先级的范围是:1-10。
    线程优先级高仅仅表示线程获取的 CPU时间片的几率高,但是要在次数比较多,或者多次运行的时候才能看到比较好的效果。

    设置线程优先级的方法:

      public final int getPriority():返回线程对象的优先级

      public final void setPriority(int newPriority):更改线程的优先级

    IllegalArgumentException:非法参数异常。
      抛出的异常表明向方法传递了一个不合法或不正确的参数

java学习笔记 --- 多线程(多线程的控制)
public class ThreadPriority extends Thread {
@Override
public void run() {
for (int x = 0; x < 100; x++) {
System.out.println(getName() + ":" + x);
}
}
}
public class ThreadPriorityDemo {
public static void main(String[] args) {
ThreadPriority tp1 = new ThreadPriority();
ThreadPriority tp2 = new ThreadPriority();
ThreadPriority tp3 = new ThreadPriority(); tp1.setName("东方不败");
tp2.setName("岳不群");
tp3.setName("林平之"); // 获取默认优先级,线程的默认优先级为5
// System.out.println(tp1.getPriority());
// System.out.println(tp2.getPriority());
// System.out.println(tp3.getPriority()); // 设置线程优先级,错误:线程的优先级范围:1-10
// tp1.setPriority(100000); //设置正确的线程优先级
tp1.setPriority(10);
tp2.setPriority(1); tp1.start();
tp2.start();
tp3.start();
}
}