自学内容网 自学内容网

并发编程学习笔记-day01

一、多线程提升计算密集型任务执行效率的示例

我们用线程执行三个任务a、b、c并将到其返回值进行累加

如果是单核cpu的话那么多个线程一起执行和单个线程执行完三个任务的效率是差不多的,因为单核cpu的话线程并发执行是轮询执行的涉及到线程上下文切换所以单个线程执行所有任务的速度是大于多个线程执行多个任务的

如果是多核cpu的话那么线程的执行可以并行处理,处理时长取决于任务时间最长的那个线程最后再将累加所需时间加在一起便是任务完成的执行时间,多线程并行是要比单个线程处理要快的

二、创建线程的三种方法

1、new Thread()线程对象

1.1

new Thread("t1")构造方法是为线程命名

new Thread("t1"){

@override

run{

代码块(需要执行的任务)

}

}

1.2

new Thread("t1"){

@override

run(){

代码块(需要执行的任务)

}.start//为启动线程

2、实现Runnable接口(推荐)

2.1

Runnable与直接new Thread 线程的区别在于

Runnable是将代码块执行任务与线程分开的

以方便线程池接口的管理

2.2无返回值

2.3

Runnable runnable=new Runnable() {

@Override

run(){

代码块(需要执行的任务)

}

}

new Thread(runnable,"t1").start//启动线程,t1为线程名称

2.4源码分析

Thread实现了Runnable接口 如果Thread传入Runnable任务对象时那么任务对象会优先通过成员变量传入Thread的run方法中去进行下一步处理

3、FutureTask和Callable配合使用

1.1

FutureTask <T> task=new FutureTask<>(new Callable(){

@Override

public T call() throw Exception{

代码块(需要执行的任务)

return obj;

}

})

Thread t1=new Thread(task,"t1")//task也能传入Thread是因为FutureTask实现了Runnable接口

task.get();//获取线程返回结果,且task.get为等待状态,task.get()的执行完成时间等于线程的执行完成时间

1.2与Runnable的区别

有返回值会抛出异常 可以将返回值交给其他线程处理

三、Lamda函数编程

如果对象内部的方法只有一个且加了@FunctionInterface注解那么表名这个对象的方法调用可以使用函数式编程具体表现为

Runnable runnable=new Runnable() {

@Override

run(){

代码块(需要执行的任务)

}

}

可以简化为:

Runnable runnable=()-> {代码块(需要执行的任务)}

如果代码块只有一行代码那么我们还可以将"{}"去掉

附加:

1、main函数中的程序开始执行时就相当于开启了一个线程称为主线程


原文地址:https://blog.csdn.net/Lemon_man_/article/details/142799575

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!