详解Java线程的创建及休眠

网友投稿 240 2023-01-08

详解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;

http://

/**

* 创建并得到线程执行的结果

* 实现Callable 接口 + Future容器 的方式

* */

public class ThreadDemo08 {

static class MyCallable implements Callable{ // 想要返回的是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 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默认情况下也是守护线程

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:昆明发货快递物流查询单号(昆明邮政快递包裹单号查询)
下一篇:解决spring data jpa 批量保存更新的问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~