Java基础巩固 -- 多线程

Java基础巩固 – 多线程

1.多线程

1.1 意义

Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。
这里定义和线程相关的另一个术语 - 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。
多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。

1.2 生命周期

  • 新建状态:使用new关键字和Thread类或是其子类创建一个线程对象后,该线程对象就处于新建状态,并会一直保持该状态直至start()。
  • 就绪状态:当线程调用start()后就进入就绪状态,在该状态下线程对象会等待分配CPU资源。
  • 运行状态:就绪线程获得CPU资源后就进入执行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。
  • 阻塞状态:如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。
  • 死亡状态:一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。

1.3 优先级

每一个 Java 线程都有一个优先级,这样有助于操作系统确定线程的调度顺序。
Java 线程的优先级是一个整数,其取值范围是 1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )。
默认情况下,每一个线程都会分配一个优先级 NORM_PRIORITY(5)。
具有较高优先级的线程对程序更重要,并且应该在低优先级的线程之前分配处理器资源。但是,线程优先级不能保证线程执行的顺序,而且非常依赖于平台。


2.Java多线程实现方式

2.1 简介

Java通过三种方式可以实现多线程,分别是继承Thread类、实现Runnable接口以及通过通过 Callable 和 Future 创建线程。而前面两种是目前主流的实现方式。

2.2 实现过程

2.2.1 实现Runnable接口

public class Test {
    public static void main (String [] args) {
        Thread t = new Thread(new MyThread());
        t.start();
    }
}

class MyThread implements Runnable {

    @Override
    public void run() {
        System.out.println("线程启动");
    }
}

2.2.2 继承Thread类

public class ThreadTest {

    public static void main(String [] args) {
        MyThread t = new MyThread();
        t.start();
    }
}

class MyThread extends Thread {

    @Override
    public void run() {
        System.out.println("线程启动");
    }
}

2.3 区别

  • 在之前的章节中提过,Java是单继承,因此当某个类继承Thread后就无法继承其他类,限制了扩展性。而Runnable则只需实现接口即可,实现Runnable的类也能继续继承其他类
  • 继承Thread类后创建的线程无法实现变量共享,但实现Runnable接口可以,具体情况看下列代码演示

继承Thread类

public class TestThread {
    public static void main(String[] args) {
        new MyThread("a").start();
        new MyThread("b").start();
        new MyThread("c").start();
    }
}

class MyThread extends Thread{
    int count = 10;
    boolean flag = true;

    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        while (flag){
            if(count <=0){
                flag = false;
                return;
            }
            System.out.println(this.getName()+"==>count==>"+count--);
        }
    }
}

实现Runnable接口

package threadStudy;

public class TestRunnable {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        new Thread(myRunnable,"a").start();
        new Thread(myRunnable,"b").start();
        new Thread(myRunnable,"c").start();
    }
}

class MyRunnable implements Runnable{
    int count = 10;
    boolean flag = true;

    @Override
    public void run() {
        while(flag){
            if(count <=0){
                flag = false;
                return;
            }
            System.out.println(Thread.currentThread().getName()+"==>count==>"+count--);
        }
    }
}

2.4 Thread关键方法

序号方法描述功能
1public void start()执行线程的方法,JVM调用线程的run()方法
2public void run()如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回
3public final void setName(String name)改变线程名称,使之与参数 name 相同
4public final void setPriority(int priority)设置线程优先级
5public final void setDaemon(boolean on)将线程标记为守护线程或用户线程
6public final void join(long millisec)等待该线程终止的时间最长为 millis 毫秒
7public void interrupt()线程中断
8public final boolean isAlive()判断线程是否处于活动状态
9public static void yield()暂停当前执行的线程,并执行其他线程
10public static void sleep(long millisec)在指定时间内让线程休眠
11public static Thread currentThread()返回对当前正在执行的线程对象的引用

3. 线程的几个概念

当深入了解Java多线程后需要了解以下几个概念

  • 线程同步
  • 线程通信
  • 死锁

Java多线程是整Java编程体系中比较难的知识点,同时也是面试考察的重灾区,因此该部分将持续更新

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值