Java多线程一些基础知识

时间:2023-02-03 13:48:25

最近复习了一些多线程方面的基础知识,做一下总结,多以自己的理解来文字叙述,如果有漏点或者理解错的地方,欢迎各位大佬多多指出;

ps:线程分为用户线程和守护线程,当程序中的所有的用户线程都执行完了之后,JVM就退出运行了,下面所讲的都是用户线程为例,我们一般创建一个新线程对象,默认都是用户线程,当然,我们可以手动调用setDeamon(true);置为守护线程;这个涉及到线程优先级的问题了,后面会详细说明;

线程的生命周期:

1. 新建状态(New)  : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。
2. 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。
3. 运行状态(Running) : 线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。
4. 阻塞状态(Blocked)  : 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
    (01) 等待阻塞 -- 通过调用线程的wait()方法,让线程等待某工作的完成。
    (02) 同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。
    (03) 其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5. 死亡状态(Dead)    : 线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

实现多线程的方式有两种:继承Thread类和实现Runnable接口,继承和实现各有各的特点,怎么选择可根据业务来决定,一般为了更好的扩展都是选择实现Runnable接口;

// 实现Runnable的方式
class MyThread implements Runnable{
private int ticket=;
public void run(){
for(int i=;i<;i++){
if(this.ticket>){
System.out.println(Thread.currentThread().getName()+" 卖票:ticket"+this.ticket--);
}
}
}
}; public class RunnableTest {
public static void main(String[] args) {
MyThread mt=new MyThread(); // 启动3个线程t1,t2,t3(它们共用一个Runnable对象),这3个线程一共卖10张票!
Thread t1=new Thread(mt);
Thread t2=new Thread(mt);
Thread t3=new Thread(mt);
t1.start();
t2.start();
t3.start();
}
}
// 继承Thread类的方式
class MyThread extends Thread{
private int ticket=;
public void run(){
for(int i=;i<;i++){
if(this.ticket>){
System.out.println(this.getName()+" 卖票:ticket"+this.ticket--);
}
}
}
}; public class ThreadTest {
public static void main(String[] args) {
// 启动3个线程t1,t2,t3;每个线程各卖10张票!
MyThread t1=new MyThread();
MyThread t2=new MyThread();
MyThread t3=new MyThread();
t1.start();
t2.start();
t3.start();
}
}

其中如果是选择继承Thread类的方式的话,因为每new一个线程对象,都会产生一个独立的对象,所以每个对象都会执行10次循环;

实现runnable接口,三个线程共享一个MyThread对象,所以3个线程一共执行10次循环;

Java多线程一些基础知识的更多相关文章

  1. Java多线程通关——基础知识挑战

    等掌握了基础知识之后,才有资格说基础知识没用这样的话.否则就老老实实的开始吧.     对象的监视器 每一个Java对象都有一个监视器.并且规定,每个对象的监视器每次只能被一个线程拥有,只有拥有它的线 ...

  2. Java多线程原理&plus;基础知识(超级超级详细)&plus;(并发与并行)&plus;(进程与线程)1

    Java多线程 我们先来了解两个概念!!!! 1.什么是并发与并行 2.什么是进程与线程 1.什么是并发与并行 1.1并行:两个事情在同一时刻发生 1.2并发:两个事情在同一时间段内发生 并发与并行的 ...

  3. Java多线程编程基础知识汇总

    多线程简介 多任务   现代操作系统(Windows.Linux.MacOS)都可以执行多任务,多任务就是同时运行多个任务.例如在我们的计算机上,一般都同时跑着多个程序,例如浏览器,视频播放器,音乐播 ...

  4. 【Java面试】基础知识篇

    [Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.Ja ...

  5. Java面试题-基础知识

    参考文章:Java面试题-基础知识 基础能力 什么是值传递和引用传递 线程状态有哪些,它们之间是如何转换的 进程与线程的区别,进程间如何通讯,线程间如何通讯? HashMap的数据结构是什么?如何实现 ...

  6. Java并发(基础知识)—— Executor框架及线程池

    在Java并发(基础知识)—— 创建.运行以及停止一个线程中讲解了两种创建线程的方式:直接继承Thread类以及实现Runnable接口并赋给Thread,这两种创建线程的方式在线程比较少的时候是没有 ...

  7. Java多线程系列--&OpenCurlyDoubleQuote;基础篇”11之 生产消费者问题

    概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...

  8. Java多线程系列--&OpenCurlyDoubleQuote;基础篇”04之 synchronized关键字

    概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...

  9. Java多线程系列--&OpenCurlyDoubleQuote;基础篇”02之 常用的实现多线程的两种方式

    概要 本章,我们学习“常用的实现多线程的2种方式”:Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程.关于线程 ...

随机推荐

  1. AngularJS包含

    1.在HTML中包含HTML文件:在HTML中,目前还不支持包含HTML文件的功能: 2.服务端包含:大多数服务端脚本都支持文件功能(SSI),使用SSI,你可以在HTML中包含HTML文件,并发送到 ...

  2. Java学习-035-JavaWeb&lowbar;004 -- JSP include 指令

    inclue 指令是将不同的文件插入到 JSP 网页中,这些文件可以是文本文件.HTML文件.JSP 文件,指令语法如下: <%@include file="相对路径"%&g ...

  3. pthread&lowbar;create如何传递两个参数以上的参数

    涉及多参数传递给线程的,都需要使用结构体将参数封装后,将结构体指针传给线程 定义一个结构体 struct mypara { var para1;//参数1 var para2;//参数2 } 将这个结 ...

  4. MYSQL SQL Server 事务

    开始: start transaction;   #   一定要有这个 ‘;’ 号. 注意: MYSQL  用的是快照隔离.就是说一个连接在修改的时候别的连接还是可以查询的. 例子: create t ...

  5. 和学生探讨吉林大学python问题

    学生们真的很强大,我知道玩微信,nodejs.... 我们去学校了解.当时互联网开始64K....

  6. Linux启动流程详解【转载】

    在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...

  7. SQL Server-聚焦sp&lowbar;executesql执行动态SQL查询性能真的比exec好?

    前言 之前我们已经讨论过动态SQL查询呢?这里为何再来探讨一番呢?因为其中还是存在一定问题,如标题所言,很多面试题也好或者有些博客也好都在说在执行动态SQL查询时sp_executesql的性能比ex ...

  8. Windows -- 使用批处理文件&period;bat删除旧文件

    Windows  --  写一个批处理文件.bat删除旧文件 1. 批处理文件 del_old_file.bat rem 删除D:\temp目录下7天前的文件 Forfiles /p D:\temp ...

  9. linux网关下drcom web自动登陆脚本

    /etc/init.d/drcomd: #!/bin/sh # # The environment is cleared before executing this script # so the p ...

  10. 742&period; Closest Leaf in a Binary Tree查找最近的叶子节点

    [抄题]: Given a binary tree where every node has a unique value, and a target key k, find the value of ...