多线程
1.要想了解多线程,必须先了解线程;要了解线程就要先了解进程,因为线程是依赖于进程而存在的;说起进程,就不得不说下程序。程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
2.什么是进程?
a.进程是执行程序的一次执行过程.它是一个动态的概念,是系统资源分配的单位.
b.只有运行的程序才有进程.
c.一个进程可以有多个线程
3.多进程有什么意义?
a.单进程只能做一件事情
b.多进程同一时间段能做多件事情,可以执行多个任务
4.什么是线程?
a.多进程内可以执行多个任务,而每一个任务就是一个线程
b.线程是一个程序的执行单元.执行路径,是一个程序使用cpu最基本的单位,是一个独立的执行路径
c.单线程:程序只有一条执行路径
d.多线程:程序有多条执行路径
5.多线程的意义?
a.多线程的存在是为了提高应用程序的使用率
b.程序的执行其实都是在抢CPU的资源,CPU的执行权。
c.多个进程是在抢这个资源,而其中的某一个进程如果执行路径比较多,就会有更高的几率抢到CPU的执行权。
注意:
很多多线程是模拟出来的,真正的多线程是指有多个cpu,即多核,如服务器。如果是模拟出来的多线程,即在一个cpu的情况下,在同一个时间点,cpu只能执行一个代码,因为切换的很快,所以就有同时执行的错局。
线程创建方式
Thread class 继承Thread类
Runnable接口 实现runnable接口
Callable接口 实现callable接口
创建线程方式:继承Thread类和实现Runnable接口
创建线程方式1:继承Thread类
1.自定义线程类继承Thread类
2.重写run() 方法,编写线程执行体
3.创建线程对象,调用start()方法启动线程
注意:线程开启不一定立即执行,有CPU调度执行
代码:
public class ThreadTest extends Thread{
@Override
public void run(){
线程体
for (int i=0;i<20;i++){
System.out.println("A--"+i);
}
}
//main线程 主线程
public static void main(String[] args) {
//创建一个线程对象
ThreadTest threadTest=new ThreadTest();
//调用start()方法
threadTest.start();
//线程体
for (int i=0;i<20;i++){
System.out.println("B--"+i);
}
}
}
创建线程方式2:实现Runnable接口
1.定义MyRunnable类实现Runnable接口
2.实现run()方法;编写线程执行体
3.创建线程对象,调用start()方法启动进程
代码:
public class ThreadTest3 implements Runnable{
@Override
public void run() {
for (int i=0;i<200;i++){
System.out.println("A--"+i);
}
}
//main线程 主线程
public static void main(String[] args) {
//创建Runnable接口的实现类对象
ThreadTest3 threadTest3=new ThreadTest3();
//创建线程对象,通过线程对象开启线程
Thread thread=new Thread(threadTest3);
thread.start();
for (int i=0;i<1000;i++){
System.out.println("B--"+i);
}
}
总结:
继承Thread类:
子类继承Thread类具备多线程能力
启动进程:子类对象.start()
不建议使用:避免OOP单继承局限性
实现Runnable接口
实现接口Runnable接口
启动进程:传入目标对象+Thread对象.start()
推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
Thread类中的方法
String getName():返回该线程的名称。
void setName(String name):改变线程名称
void setPriority(int newPriority):更改线程的优先级。(1~10)
int getPriority():返回线程的优先级 (每个线程默认优先级5)
static Thread currentThread():返回当前正在执行的线程对象
static void sleep(long millis):睡眠
void join():等待该线程终止。
静态代理
1.真实对象和代理对象都要实现同一接口
2.代理对象要代理真实角色
好处:
1.代理对象可以做很多真实对象没法做的事情
2.真实对象专注做自己的事情