之前写的都乱糟糟的,现在也需要重新记忆一遍。所以重新整理一下JUC包。
多线程及其优缺点
什么是线程
是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。(wiki百科)
创建线程的三种方式
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
//1、继承Thread方式
Thread thread1 = new Thread(){
@Override
public void run() {
System.out.println("thread1 start");
}
};
thread1.start();
//2、实现Runnable接口
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread2 start");
}
});
thread2.start();
//3、实现Callable接口
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future future = executorService.submit(new Callable() {
@Override
public String call() throws Exception {
return "future start";
}
});
try {
String result = future.get();
System.out.println(result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
在jdk8之后用lambda表达式转换一下
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
//1、继承Thread方式
Thread thread1 = new Thread(() -> System.out.println("thread1 start"));
thread1.start();
//2、实现Runnable接口
Thread thread2 = new Thread(() -> System.out.println("thread2 start"));
thread2.start();
//3、实现Callable接口
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future future = executorService.submit(() -> "future start");
try {
String result = future.get();
System.out.println(result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
简化了一点,但是更多是有点懵,lambda为什么会简化方法,->是怎么找到对应的方法,下次在研究。
为什么要用多线程
早期的CPU是单核的,为了提升计算能力,将多个计算单元整合到一起。形成了多核CPU。多线程就是为了将多核CPU发挥到极致,一边提高性能。
多线程缺点呢
上面说了多线程的有点是:为了提高计算性能。那么一定会提高?
答案是不一定的。有时候多线程不一定比单线程计算快。引入《java并发编程的艺术》上第一个例子
public class ConcurrencyTest {
/** 执行次数 */
private static final long count = 10000l;
public static void main(String[] args) throws InterruptedException {
//并发计算
concurrency();
//单线程计算
serial();
}
private static void concurrency() throws InterruptedException {
long start = System.currentTimeMillis();
Thread threa