多线程第一天

多线程

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.真实对象专注做自己的事情
原文地址:https://www.cnblogs.com/lhy8116/p/14205153.html