Java线程 详解Java线程的创建及休眠
MercuryG 人气:0想了解详解Java线程的创建及休眠的相关内容吗,MercuryG在本文为您仔细讲解Java线程的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Java线程的创建,java线程休眠,下面大家一起来学习吧。
一、进程vs线程
- 1、进程是系统分配资源的最小单位;线程是系统调度的最小单位
- 2、一个进程中至少要包含一个线程
- 3、线程必须要依附于继承,线程是进程实质工作的一个最小单位
二、线程的创建方式
继承Thread类 实现线程的创建(2种写法)
1种写法
public class ThreadDemo03 { static class MyThread extends Thread{ @Override public void run(){ System.out.println("线程名称:" + Thread.currentThread().getName()); } } public static void main(String[] args) { // 创建了线程 Thread t1 = new MyThread(); // 启动线程 t1.start(); System.out.println("当前线程的名称(主线程):" + Thread.currentThread().getName()); } }
2种写法
public class ThreadDemo04 { public static void main(String[] args) { Thread thread = new Thread(){ @Override public void run() { System.out.println("线程名:" + Thread.currentThread().getName()); } }; thread.start(); } }
继承Thread类的创建方式的缺点:在Java语言设计当中只能实现单继承,如果继承了Thread类,就不能继承其他类了,所以这种创建方式在开发中使用。
三、实现Runnable接口的方式(3种)
在Java中不能实现多继承,但是可以实现多接口
1种方法
public class ThreadDemo05 { static class MyRunnable implements Runnable{ @Override public void run() { System.out.println("线程名:" + Thread.currentThread().getName()); } } public static void main(String[] args) { // 1、新建Runnable类 MyRunnable runnable = new MyRunnable(); // 2、新建Thread Thread thread = new Thread(runnable); // 3、启动线程 thread.start(); } }
2种方法
public class ThreadDemo06 { public static void main(String[] args) { // 匿名内部类的方式实现线程 Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("线程名:" + Thread.currentThread().getName()); } }); thread.start(); } }
3种方法
/** * 使用拉姆达表达式的方式创建 * **/ public class ThreadDemo07 { public static void main(String[] args) { Thread thread = new Thread(() -> { System.out.println("线程名: "+ Thread.currentThread().getName()); }); thread.start(); } }
四、实现Callable接口的方式(1种)
为了拿到执行完线程后可以得到返回值的方法
package Thread; import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /** * 创建并得到线程执行的结果 * 实现Callable 接口 + Future容器 的方式 * */ public class ThreadDemo08 { static class MyCallable implements Callable<Integer >{ // 想要返回的是Integer类型 @Override public Integer call() throws Exception { // 生成一个随机数 int num = new Random().nextInt(10); System.out.println("子线程:" + Thread.currentThread().getName() + "随机数:" + num); return num; } } public static void main(String[] args) throws ExecutionException, InterruptedException { // 1、创建一个Callable MyCallable myCallable = new MyCallable(); // 2、创建一个FutureTask 对象来接受返回值 FutureTask<Integer> futureTask = new FutureTask<>(myCallable); // 3、创建Thread Thread thread = new Thread(futureTask); // 启动线程 thread.start(); // 得到线程执行结果 int result = futureTask.get(); System.out.println(String.format("线程名:%s,数字:%d", Thread.currentThread().getName(), result)); } }
五、线程的休眠
- 1、
Thread.sleep()
- 2、
TimeUnit.SECONDS.sleep(1)
休眠一秒钟 - 其中可选的有
DAYS
表示天,HOURS
表示小时
- 3、Thread.sleep(TimeUnit.SECONDS.toMillis(1))
练习:使用连个线程来打印“AABBCCDD”,一个线程只能打印"ABCD"
package Thread; public class ThreadDemo09 { public static void main(String[] args) { Runnable runnable = new Runnable() { @Override public void run() { String data = "ABCD"; for (char item:data.toCharArray()) { System.out.print(item); try { // 休眠一段时间 Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } }; Thread t1 = new Thread(runnable); Thread t2 = new Thread(runnable); t1.start(); t2.start(); } }
六、线程优先级
默认优先级为5
最小优先级为1
最大优先级为10
优先级越大那么它的执行权重越高
理论上优先级越高,执行权限也就越大,但是CPU的调度实很复杂的,所以不会严格按照优先级的排序去执行,但总体还是优先级越高,执行权重越高
七、守护线程
守护线程使用场景:Java垃圾回收器、TCP的健康检测
守护线程需要注意的事项:
- 1、守护线程必须设置在Thread.start()之前,如果设置守护线程再开始线程之后,那么程序就会报错,并且设置的守护线程值不能生效
- 2、在守护线程t1内部创建一个新的线程t2,此时t2默认情况下也是守护线程
加载全部内容