并发编程学习笔记-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)!