礼让线程
概述: 通俗点讲,线程礼让就是让当前正在运行的线程,并执行其他线程。但在执行过程中,礼让有可能会不成功,这是因为这个礼让是要暂停当前正在执行的线程,这个暂停的时间是相当短的,如果在这个线程暂停完毕以后,其他的线程还没有抢占到CPU的执行权,那么这个时候这个线程应该再次和其他线程抢占CPU的执行权。
public static void yield(): 暂停当前正在执行的线程对象,并执行其他线程。
代码演示:
public class Test extends Thread{
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
test1.setName("一号");
test2.setName("二号");
test1.start();
test2.start();
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName()+"执行");
Thread.yield();
}
}
}
结果:
一号执行
二号执行
一号执行
二号执行
一号执行
二号执行
守护线程
public final void setDaemon(boolean on):
将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。
该方法必须在启动线程前调用。
代码演示:
public class Test2{
public static void main(String[] args) {
God god = new God();
god.setDaemon(true);//设置线程为守护线程,默认为false
god.start();
new Thread(()->{
for (int i = 0; i < 500; i++) {
System.out.println("你的第"+i+"天");
}
}).start();
}
}
class God extends Thread{
@Override
public void run() {
while(true) {
System.out.println("上帝守护着你");
}
}
}
结果较长,就不贴出来了,可以把代码复制自己运行一下,也许守护线程在其他线程运行结束之后还会运行一段时间,因为虚拟机退出需要一个过程。
多线程的另外两种创建方法
1、实现Runnable接口
1、实现Runnable接口
2、重写run方法
3、使用start方法启动线程
注意:实现Runnable接口后必须重写run方法,创建新线程的方法为:
new Thread(类对象,线程名);//线程名可省略,有默认名
线程的使用方法与继承Thread类创建的线程的方法相同,同样有休眠、礼让、守护等等。
代码演示
public class Test3 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 2; i++) {
System.out.println(Thread.currentThread().getName()+"执行了"+i);
}
}
public static void main(String[] args) {
Test3 test = new Test3();
Test3 test2 = new Test3();
new Thread(test,"线程一").start();
new Thread(test2,"线程二").start();
}
}
2、继承Callable接口
1.创建一个类实现Callable 接口
2.创建ExecutorService exe = Executors.newFixedThreadPool(1);//参数为创建线程数量
3.创建Future对象,用submit方法,将CallableZ子类作为参数传进去
4.用Future对象的get方法可以获取到call方法返回值
5.最后用shutdawn关闭服务
注意:实现 Callable 接口。 相较于实现 Runnable 接口的方式,方法可以有返回值,并且可以抛出异常。
执行 Callable 方式,需要 Future实现类的支持,用于接收运算结果。
代码演示:
import java.util.concurrent.*;
public class Test4 implements Callable {
public static void main(String[] args) throws ExecutionException, InterruptedException {
Test4 test = new Test4();
ExecutorService exe = Executors.newFixedThreadPool(1);
Future<Integer>fut = exe.submit(test);
System.out.println(fut.get());
}
@Override
public Integer call() throws Exception {
System.out.println(11);
return 5;
}
}
结果:
11
5