1.什么是并发?
当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其 它线程处于挂起状。这种方式我们称之为并发(Concurrent)。 ----百度百科
2.什么多线程?
多线程就是把操作系统中的这种并发执行机制原理运用在一个程序中,把一个程序划分为若干个子任务,多个子任务并发执行,每一个任务就是一个线程。这就是多线程程序。 ----百度百科
3.使用多线程的优缺点?
优点:在一些耗时的程序上使用多线程可以提高效率。
缺点:消耗系统内存,线程越多所需的内存越多;线程的一些操作如休眠、终止会影响程序;线程使用不当会影响线程。
4.多线程的实现方式:
1.继承Thread类 ---源码来B站UP主(努力考研的小狂神)
//创建线程的方式一:继承Thread类,重写run()方法,调用start开启线程 //总结:线程开启不一定立即执行,Cpu调度执行。 public class TestThread1 extends Thread{ @Override public void run() { //run方法线程体 for (int i=0;i<20;i++){ System.out.println("我在看代码---"+i); } } public static void main(String[] args) { //main线程,主线程 //创建一个线程的对象 TestThread1 thread1=new TestThread1(); //调用start()方法 开启线程 thread1.start(); for (int i=0;i<10;i++){ System.out.println("我在学习多线程---"+i); } } }
2.实现Runnable接口
//创建线程方式2 :实现Runnable接口,重写run方法,需要丢入runnable接口实现类,调用start方法 public class TestThread3 implements Runnable{ @Override public void run() { //run方法线程体 for (int i=0;i<20;i++){ System.out.println("我在看代码---"+i); } } public static void main(String[] args) { //main线程,主线程 //创建runnable接口实现类对象 TestThread3 testThread3=new TestThread3(); //创建线程,通过线程对象开启我们的代理 // Thread thread=new Thread(testThread3); // // thread.start(); new Thread(testThread3).start(); for (int i=0;i<10;i++){ System.out.println("我在学习多线程---"+i); } } }
查看Thread源码可知:Thread实现了Runnable接口。
public class Thread implements Runnable {
3.实现Callable接口
/** * Callable好处 * 1.定义返回值 * 2.可以抛出异常 */ public class TestThread5 implements Callable<String> { private int i=0; //重写Callable方法 @Override public String call() throws Exception { i++; return "练习callable方法"+ i; } public static void main(String[] args) throws ExecutionException, InterruptedException { TestThread5 t1=new TestThread5(); TestThread5 t2=new TestThread5(); TestThread5 t3=new TestThread5(); //创建执行服务 ExecutorService executorService= Executors.newFixedThreadPool(3); //提交执行 Future<String> r1=executorService.submit(t1); Future<String> r2=executorService.submit(t2); Future<String> r3=executorService.submit(t3); //获取结果 String rs1=r1.get(); String rs2=r2.get(); String rs3=r3.get(); System.out.println(rs1); System.out.println(rs2); System.out.println(rs3); //关闭服务 executorService.shutdownNow(); } }