【Java】MuliThread 多线程

 

程序Program 是完成特定人,用某种语言编写的一组指令集合,即一段静态代码,静态对象

进程Process 是程序的一次执行过程,可以是一个正在执行的程序

- 程序是静态的,进程是动态的

- 进程是分配资源的单位,系统运行时为每个进程分配不同的内存区域

 

- 线程 Thread 进程可进一步细化为线程,一个程序内部的一条执行路径

一个进程在同一时间并行执行多个线程,就是多线程的

线程作为调度和执行的单位,每个线程用友独立的运行栈和程序计数器

 

- 一个进程的多个线程共享内存单元/内存空间地址,从同一堆中分配对象,可以访问相同变量和对象

- 可能造成数据安全隐患

 

并行和并发

- 并行 多个人同时做不同的事

- 并发 多个人同时处理一件事

 

Java的应用程序 java.exe 至少三个线程存在 Main GC 异常

 

为什么需要多线程?

- 提高计算性能 增强用户体验、

- 提供CPU的使用效率

- 改善程序结构,把进程拆分多个线程独立运行

 

使用场景:

- 程序执行超过1个以上的任务

- 实现一些等待任务 用户输入,文件读写、网络操作

- 后台程序

 

创建多线程

第一种

- 创建一个类去继承Thread类

- 重写Thread类的run方法 此线程的操作声明在run中

- 创建Thread类的子类实例

- 调用start方法开启线程

 

方式一

public class ThreadTest {
    public static void main(String[] args) {
        // 创建实例
        Thread thread = new MyThread();
        // 开启线程 调用当前线程的run方法运行 不能直接调用run的方式启动线程
        thread.start();
      System.out.println(
"Main"); } } // 编写一个类继承Thread线程类 class MyThread extends Thread{ // 重写Run方法 @Override public void run() { for (int i = 0; i < 1000; i++) { String check = i % 2 == 0 ? "yes "+i : "no "+i; System.out.println(check); } } }

 

方式二使用匿名内部类

public class ThreadTest {
    public static void main(String[] args) {
        // 使用匿名内部类
        Thread thread = new Thread(){
            @Override
            public void run() {
                for (int i = 0; i < 1000; i++) {
                    String check = i % 2 == 0 ? "yes "+i : "no "+i;
                    System.out.println(check);
                }
            }
        };
        thread.start();
    }
}
View Code

 

方式三匿名直接使用

public class ThreadTest {
    public static void main(String[] args) {
        // 使用匿名对象 + 匿名内部类 直接调用
        new Thread(){
            @Override
            public void run() {
                for (int i = 0; i < 1000; i++) {
                    String check = i % 2 == 0 ? "yes "+i : "no "+i;
                    System.out.println(check);
                }
            }
        }.start();
    }
}

 

 

//常用方法
// start(); 开启线程
// run(); 运行线程,执行run方法体内的代码块
// currentThread(); 静态方法,返回指向当前代码的线程
// getName();获取当前线程名字
// setName();设置当前线程名字 开启线程之前使用
// yield(); 释放CPU执行权
// join(); 线程a中调用线程b的join 线程a进入阻塞状态,直至线程b执行完在执行线程a
// stop(); 强行结束当前线程 已过时
// sleep(long millitime); 当前线程睡眠,超时参数时间执行线程,指定的参数时间内,线程是阻塞状态
// isAlive(); 判断线程是否存活

线程优先级设置 
MAX_PRIORITY 10 最大优先级 10
MIN_PRIORITY 1 最小优先级 1
NORM_PRIORITY 5 通常优先级 5

获取和设置当前线程的优先级
getPriority(); 获取线程优先级
setPriority(int p); 设置线程优先级

高优先级只是表示线程抢占到CPU执行的概率要高于低优先级,并不是一定优先

第二种实现Runnable接口
- 创建实现类
- 重写run方法
- 创建实例
- 实例作为参数注入线程实例中
- 线程实例调用start方法开启
public class ThreadTest {
    public static void main(String[] args) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100000; i++) {
                    System.out.println(Thread.currentThread().getName());
                }
            }
        }).start();
    }
}

 

线程的生命周期

新建 - 就绪 - 运行 - 阻塞 - 释放

 

同步代码块

synchronized(同步监视器对象) { 需要被同步的代码}

1 操作共享数据的代码 即需要被同步的代码

2 共享数据,多线程共同操作的变量 

3 同步监视器,俗称锁 任何一个类的对象都可以充当锁

实现同步的要求是,所有的线程都公用一把锁

- 解决线程安全,性能降低了




posted @ 2020-04-18 16:32  emdzz  阅读(116)  评论(0编辑  收藏  举报