Java多线程的知识点

举报
王同学要努力 发表于 2022/09/11 10:14:59 2022/09/11
1.1k+ 0 0
【摘要】 Java多线程的知识点

1.并发与并行

并发:
指两个或多个事件在同一个时间段内发生。

并行:
并行:指两个或多个事件在同一时刻发生(同时发生)

2.线程与进程

进程:

  • 是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建运行消亡的过程

线程:

  • 线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。

线程的创建

构造方法:

  • public Thread() :分配一个新的线程对象

  • public Thread(String name) :分配一个指定名字的新的线程对象。

  • public Thread(Runnable target) :分配一个带有指定目标新的线程对象。

  • public Thread(Runnable target,String name) :分配一个带有指定目标新的线程对象并指定名字

一些常见的方法:

  • public String getName() :获取当前线程名称。

  • public void start() :导致此线程开始执行; Java虚拟机调用此线程的run方法。

  • public void run() :此线程要执行的任务在此处定义代码。

  • public static void sleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。

  • public static Thread currentThread() :返回对当前正在执行的线程对象的引用。

wait()方法

  1. wait方法的作用就是使当前执行的代码进行等待,wait()方法就是Object类的方法,该方法是用来将当前线程置入"预执行队列中",并且在wait方法()所在的代码处停止执行,直到接到通知或被中断中止

  2. wait方法只能在同步方法中或同步块中调用。如果调用的wait时,没有持有适当的锁,会抛出异常。

  3. wait()方法执行后,当前线程释放锁,线程与其它线程竞争重新获取锁

notify() 方法

notify方法就是使停止的线程继续运行

  1. 方法notify()也要在同步方法或同步块中调用,该方法是用来通知那些可能等待该对象的对象锁的其它线程,对其发出通知notify,并使它们重新获取该对象的对象锁。如果有多个线程等待,则有线程规划器随机挑选出一个呈wait状态的的线程。
  2. 在notify()方法后,当前线程不会马上释放该对象锁,要等到执行notify()方法的线程将程序执行完,也就是退出同步代码块之后才会释放对象锁。

查看线程的运行状态

线程有六种状态分别是:新建、运行、阻塞、等待、计时等待和终止

实现思路:
创建一个类;ThreadState,实现Runnable接口
定义三个方法:

  • waitForASecond():使当前线程等待0.5秒或其他线程调用notify()或notifyAll()方法

  • waitForYears();使当前线程永久等待,直到其他线程调用notify()或notifyAll()方法

  • notifyNow():唤醒由调用wait方法()进入等待状态的线程

代码实现:

package cn.xiaoxuzhu.daily;
 
/**
 * @author  小王同学;
 * @version 1.0.0
 * Description:
 *
 * 1.题目描述:
 * 题目:线程有6个状态:新建,运行,阻塞,等待,计时,等待和终止
 * new新进程时,线程处于新建状态。
 * 调用start()方法,线程处于运行状态
 * 对于一些含有时间参数的方法如Thread类的sleep方法();可以使线程处于计时等待状态
 * 当run()方法运行完毕或出现异常时,线程处于终止状态。
 * 实现:查看线程的运行状态。
 *
 * 2.解题思路:
 * 创建一个类;ThreadState,实现Runnable接口
 *
 * 定义三个方法
 * .waitForASecond():使当前线程等待0.5秒或其他线程调用notify()或notifyAll()方法
 * .waitForYears();使当前线程永久等待,直到其他线程调用notify()或notifyAll()方法
 * .notifyNow():唤醒由调用wait方法()进入等待状态的线程
 *
 * 使用Thread类的getState()方法,可以获得线程的状态
 * 该方法的返回值是Thread.state
 *
 */
 
public class ThreadState implements Runnable{ 
    public  synchronized  void waitForASecond()throws InterruptedException{
        wait(500); //使当前线程等待0.5秒或其他线程调用notify()或者notifyAll()方法
 
    }
    public  synchronized void waitForYears()throws  InterruptedException{
        wait();  //使当前线程永久等待,直到其他线程调用notify()或notifyAll()方法
    }
    public  synchronized void  notifyNow()throws  InterruptedException{
        notify(); //唤醒由调用wait方法()进入等待状态的线程
        Thread.sleep(100); //留时间打印
    }
    @Override
    public void run() {
 
        try {
            waitForASecond(); //在新线程中运行waitForASecond();方法
            waitForYears();   //在新线程中运行waitForYears()方法
        }catch (InterruptedException e){
            e.printStackTrace();
 
        }
 
    }
}
 
package cn.xiaoxuzhu.daily;
 
public class _67 {
    public static void main(String[] args) throws InterruptedException {
        ThreadState state=new ThreadState(); //创建state对象
        Thread thread=new Thread(state); //利用state对象创建Thread对象
        System.out.println("新建线程:"+thread.getState()); //输出线程状态
        thread.start(); //调用thread对象的start()方法,启动新线程
        System.out.println("启动线程:"+thread.getState()); //输出线程状态
        Thread.sleep(100);//当前线程休眠0.1秒,使新线程运行waitForASecond()方法
        System.out.println("计时等待:"+thread.getState()); //输出线程状态 
        Thread.sleep(1000);//当前线程休眠1秒,使新线程运行waitForYears()方法
        System.out.println("等待线程:"+thread.getState());//输出线程状态
        state.notifyNow();//调用state的notifyNow()方法
        System.out.println("唤醒线程:"+thread.getState());//输出线程状态
        Thread.sleep(1000);;//当前新线程休眠1秒,使新线程结束
        System.out.println("终止线程:"+thread.getState()); //输出进程状态  

image.png

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。