什么是进程什么是线程
一个多核主机 可以产生 多个进程 ,一个进程可以产生多个线程
线程是比进程更小粒度
共享代码区以及段基址
相互之间可以访问彼此的存储空间
进程之间完全隔绝
必须通过操作系统来实现通信功能
java多线程类 Thread
我们使用这个类可以来实现我们自己的多线程
在这里插入代码片//重载多线程 class MyThread extends Thread{ String title; public MyThread(String title){ this.title=title; } // 具体实现多线程 public void run(){ for (int i = 0; i < 10 ; i++) { String a1=this.title+" "+ i; a1= i==9? a1+"\n" : a1; System.out.println(a1); } } } public class manyThread { public static void main(String a[]){ // run方法执行效果 new MyThread("run效果线程A").run(); new MyThread("run效果线程B").run(); new MyThread("run效果线程C").run(); // start方法执行效果 new MyThread("start效果线程A").start(); new MyThread("start效果线程B").start(); new MyThread("start效果线程C").start(); } }
对比是否开启多线程的运行效果
不启用多线程 | 启用多线程 |
run效果线程A 0 | start效果线程A 0 |
run效果线程A 1 | start效果线程C 0 |
run效果线程A 2 | start效果线程B 0 |
run效果线程A 3 | start效果线程C 1 |
run效果线程A 4 | start效果线程A 1 |
run效果线程A 5 | start效果线程C 2 |
run效果线程A 6 | start效果线程B 1 |
run效果线程A 7 | start效果线程B 2 |
run效果线程A 8 | start效果线程C 3 |
run效果线程A 9 | start效果线程A 2 |
start效果线程A 3 |
run效果线程B 0 | start效果线程C 4 |
run效果线程B 1 | start效果线程B 3 |
run效果线程B 2 | start效果线程A 4 |
run效果线程B 3 | start效果线程C 5 |
run效果线程B 4 | start效果线程B 4 |
run效果线程B 5 | start效果线程C 6 |
run效果线程B 6 | start效果线程A 5 |
run效果线程B 7 | start效果线程C 7 |
run效果线程B 8 | start效果线程B 5 |
run效果线程B 9 | start效果线程C 8 |
start效果线程A 6 | |
run效果线程C 0 | start效果线程C 9 |
run效果线程C 1 |
run效果线程C 2 | start效果线程B 6 |
run效果线程C 3 | start效果线程A 7 |
run效果线程C 4 | start效果线程B 7 |
run效果线程C 5 | start效果线程A 8 |
run效果线程C 6 | start效果线程B 8 |
run效果线程C 7 | start效果线程A 9 |
run效果线程C 8 | |
run效果线程C 9 | start效果线程B 9 |
所以我们一定要使用start 启用多线程
继承Thread 造成的单继承局限
我们知道在java中实现 类是单继承的,所以当我们需要多继承的多线程时该怎么处理呢
采用接口克服单继承局限
class MyThread implements Runnable{ String title ; MyThread(String title){ this.title=title; } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(this.title+"运行"+i); if (i==9) System.out.println("\n"); } } } public class InterfaceThread { public static void main(String a[]) { for (int i = 0; i < 3; i++) { MyThread mt=new MyThread("线程a"+i); new Thread(mt).start(); } } }
lambda实现多线程
代码很精简
public class lambdaThread { public static void main(String a[]) { for (int i = 0; i < 3; i++) { String title="线程-"+(i+1); Runnable run =()->{ for (int j = 0; j < 10; j++) { System.out.println(title+"运行"+j); if (j==9) System.out.println("\n"); } }; new Thread(run).start(); } } }
callable多线程带返回值
java.util.concurrent.callable
可以满足多线程需要返回值的场景