多线程
什么是程序:为了完成某项特定的任务,使用某种语言,编写一组指令的集合
什么是进程:是一个正在进行的程序
什么是线程:在一个进程中,执行的一套功能流程,称为线程
在一个进程中,执行的多套功能流程,称为多线程
多线程程序的优点
1、提高应用程序的响应。对图形化界面更有意义,可增强用户体验。
2、提高计算机系统CPU的利用率改善程序结构。
3、将既长又复杂的进程分为多个线程,独立运行,利于理解和修改
但是当多个线程访问共享变量的时候 会出现线程安全的问题
线程的生命周期
声明线程的几种方法
一 、 创建一个类继承 Thread 类并且重写Thread 类的 run() 方法
public class MyThread extends Thread{ //线程执行体 public void run() { for (int i = 0; i < 8; i++) { System.out.println(i); } } }
public class TestMyThread { public static void main(String[] args) throws InterruptedException { //我创建的线程 Thread myThread = new MyThread(); //执行我的线程体 myThread.start(); //下面是主线程 for (int i = 0; i < 8; i++) { Thread.sleep(1); System.out.println("haha"); } } }
打印结果
haha haha 0 1 2 3 4 5 6 7 haha haha haha haha haha haha
二、 创建一个类实现Runnable接口并且实现run方法
public class MyRunnable implements Runnable{ private List<String> list; public MyRunnable (List<String> list){ this.list = list; } //线程执行体 @Override public void run(){ //批量插入 batchInsertDate(list); } }
public class TestMyRunnable { public static void main(String[] args) { List<String> list = new ArrayList<String>(); //我创建的线程执行体 MyThread myRunnable = new MyRunnable (list); //创建一个线程,并将我的线程执行体传入到线程 Thread thread = new Thread(myRunnable,"线程的名称" ); thread.start(); } }
三、 创建一个类实现Callable接口并且实现call方法(和Runnable不同的是Callable接口有返回值,Callable实现call方法,Callable接口有异常)启动Runnable接口用new Thread(Runnable runnable).start();
扫描二维码关注公众号,回复:
1118240 查看本文章
public class MyCallable implements Callable<List>{ @Override public List call() throws Exception { ArrayList list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); System.out.println(list); return list; } }
public class TestMyCallable { public static void main(String[] args) throws InterruptedException, ExecutionException { //new Thread(Runnable runnable)但是构造器中不能传入Callable接口 //FutureTask实现了Runnable接口,可以将实现了Callable接口的类传进FutureTask的构造方法中 FutureTask futureTask = new FutureTask(new MyCallable()); new Thread(futureTask).start(); //利用线程池执行Callable接口,可直接将Callable传给submit方法即可 //该方法返回call方法的返回值对象Future<T> 并通过Future<T>.get()方法得到返回值 ExecutorService excu = Executors.newFixedThreadPool(10); Future<List> returnValue = excu.submit(new MyCallable()); System.out.println("返回值:" + returnValue.get()); } }