1.多线程:进程:正在运行的程序,当一个程序进入内存运行就会成为一个进程,进程是出于运行过程中的程序,并且具有一定的独立功能
2.线程:是程序进程中的一个执行单元,赋值当前进程中程序的执行,一个进程最少有一个线程,一个进程中可以有多个线程,这个程序可以称之为多进程.
3.一个程序运行时至少有一个进程(进程大于线程,进程包含线程),一个进程中可以包含多个线程(多线程就是多条路运行)
4.多线程调度方式:1.分时调度:平均分配线程占用CPU的时间,所以线程轮流使用CPU的使用权,平均分配每个线程使用的时间.
5.抢占式调度:随机的给线程分配时间,感觉像是在抢占资源但是实际上是随机分配时间:优先让优先级高的线程使用CPU,如果线程的使用权限一样那么随机分配使用时间,
java是抢占式调度。
6.CPU的抢占式分配实际是在多个线程之间高速切换,对于CPU一个核而言某个时刻只能执行一个线程,而CPU在多个核之间高速切换只是我们肉眼看不见感觉像是在同一时刻运行
实际上某一时刻只能运行一个线程。
7.主线程就是main方法的线程;jvm虚拟机在启动会必回有一个执行路径从main方法开始,一直执行到main方法结束,在java中称之为主线程
8.Thread类是线程类,new一个Thread对象实际上就是开了一个线程
9.多线程开启步骤:1、new一个类继承Thread;2、重写run方法,改成自己想要执行的内容;3、创建子类对象,也就是创建新类对象4、用创建的对象调用.start()方法,开启线程
10.用于执行main方法的线程叫主线程,创建的多线程对象,Person p=new Person;p.run()这样调用run方法并不是多线程,这就是普通对象调用run方法走的还是主线程main;
需要用.start()方法开启多线程才行,MyThread m=new MyThread();m.start()这样开启多线程调用多线程方法;java是一个抢占式线程调用的方法,多线程不提高速度但提高效率
那个对象调用.start()就到那个对象类中找重写后的run()方法,
11.不能直接Thread t1 = new Thread();因为需要重写它的run方法才能运行自己想要的线程运行任务;在内存中多线程就是多了个栈
一个对象只能有一个线程,如果要开多个线程就需要new多个对象调用.start()方法
12.Runnable方法开启线程:1.定义一个类实现Runnable接口,2.重写Runnable实现类中的run()方法3.创建Thread对象4.把Runnable对象作为参数放进Thread对象的构造函数中,5.用 Thread对象调用.start方法;
13.Runnable接口避免了单继承的局限性;且将现场任务和线程对象进行了分离,这样更符合变成思想,Thread创建对象后线程任务和线程对象都耦合在一起,用Runnable实现了分耦
14.获取执行线程的名字:Thread.currentThread().getname();先获取当前运行的线程对象:Thread.currentThread();再获取名字:.getName();
15.1.先创建Runnable的实现类并重写run()方法;2.创建Runnable对象:MyRunnable mr=new MyRunnable();3.创建Thread对象用于执行线程任务并把Runnable对作为Thread的构造函 数的参数传进去;Thread t=new Thread(mr);开启多线程:t.start();
用匿名内部类的方式可以省去创建Runnable实现类的步骤: 1.用多态形式创建Runnable对象:Runnable a=new Runnable(){ public void run(){system.out.println("dsdsd")}
2.创建Thread对象并把Runnable对象作为参数传进Thread的构造函数中:Thread th=new Thread(a);3.开启多线程:th.start();
16.线程池Runnable接口:先创建一个Runnable的实现类并重写run()方法1.创建此案城池对象:ExecutorService es=Executors.newFixedThreadPool(2);
2.创建Runnable对象:MyRunnable mr=new MyRunnable();3.开启线程并执行线程任务:es.submit(mr);4.释放资源:es.shutdown();
17.线程池Callable接口:1.先创建一个Callable的实现类,并重写run()方法,run()方法需要写好返回值,并在方法名的泛型上写好返回值类型;
2.创建线程池对象:ExecutorService es=Executors.newFixedThreadPool(2);3.创建Callable对象:MyCallable mc=new MyCallable();
4.接收返回值:Future<String> fu=es.submit(mc);通过get()方法获取返回值:String s=fu.get();5.关闭资源:es.shutdown();