JAVA线程基础概念及使用
一、线程和进程的区别
在操作系统中所有运行的任务通常对应一个进程,进程是系统进行资源分配和调度的一个独立单位。线程是进程的组成部分,一个进程最少包含一个线程。并发和并行的区别是,并发指的在同一时刻内,多个指令在多个处理器上同时执行。并发指的是同一个时刻内一个只有一条指令执行,但多个进程指令被快速轮换执行。使得宏观上感觉是多个进程在同时执行。多个线程共享进程的内存资源和数据资源等。而多个进程之间不能共享内存。
JAVA实现多线程有三种方式:1、继承thread类 2、实现runnable 3、使用Callable和future创建多线程
二、线程的使用方式
第一种方式 继承Thread
package cn.test.hf; /**
* 继承thread实现多线程
*/
public class CreateThread extends Thread { private int i; public void run() { for (i = 0; i < 100; i++) { // 打印出当前这个线程的名称
System.out.println(this.getName() + "----" + i + "-------" + System.currentTimeMillis());
} } public static void main(String[] args) { for (; i < 100; i++) { System.out.println(Thread.currentThread().getName() + "----" + i + "-------" + System.currentTimeMillis());
if (i == 20) { // 创建两个线程
CreateThread thread1 = new CreateThread();
thread1.start();
CreateThread thread2 = new CreateThread();
thread2.start();
}
} }
}

从结果可以看出,当主线程跑到i=20的时候,开始去执行子线程,同时主线程还是在运行着(是否分配了不同的CPU,那么就是并发的运行,如果是单个的话那么就是时间片轮转)。使用继承thread类的方式去实现多线程,实例变量不能共享。类变量可以共享。
第二种方式:实现Runnable
package cn.test.hf;
public class RunnableTest implements Runnable {
public void run() {
System.out.print("线程名称:" + Thread.currentThread().getName());
}
public static void main(String[] args) {
RunnableTest r = new RunnableTest();
new Thread(r,"线程1").start();
new Thread(r,"线程2").start();
}
}
这种方式由于使用的是同一个对象,所以实例遍历可以共用。
第三种方式:实现Callable接口,这种实现多线程的方式和runnable类似,只不过Callable方式会带有返回值。
package cn.test.hf; import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask; public class CallableTest implements Callable { public Object call() throws Exception { return 1;
} public static void main(String[] args) { try {
CallableTest call = new CallableTest();
FutureTask future = new FutureTask(call); new Thread(future).start();
System.out.print(future.get());
} catch (Exception e) { }
}
} 三种实现多线程的方式对比:实现Runnable和实现Callable方式的优点有1、还可以实现其他的类,可扩展。2、多个线程可以共享同一个target对象,可以共享数据。在代码结构层次可以将CPU、数据、代码分开,形成清晰的模型。
继承Thread类实现多线程用点是编程方便。三种方式推荐使用Runnable和Callable+Future。 三、线程的生命周期
1、新建(New)
程序使用New创建一个线程对象后,该线程的状态处于新增状态,仅仅由JAVA虚拟机为其分配内存,初始化其成员变量的值。
2、就绪(Runnable)
调用线程的start方法会将线程改变为就绪状态,还差获得CPU
3、执行(Running)
线程就绪状态获得CPU进入执行状态。
4、阻塞(Blocked)
线程调用sleep方法主动放弃CPU、线程调用了阻塞式IO方法、线程试图获取一个同步监视器,但是被其他线程所持有、线程在等待某个通知、程序调用了线程的suspend方法将其挂起的时候线程会进入阻塞。阻塞的线程获得某些资源后会进入就绪状态,等待获得调度获得CPU,不会直接进入执行状态。
5、死亡(Dead)
线程执行完后就会消亡。使用isAlive方法可以检测线程是否死亡,新建和死亡的线程会返回false、其他的返回true。 四、控制线程
1、join线程,Thread提供了让线程等待另一个线程的方法join()
package cn.test.hf;
public class RunnableTest implements Runnable {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("线程名称:" + Thread.currentThread().getName() + "=====" + i);
}
}
public static void main(String[] args) {
try {
RunnableTest r = new RunnableTest();
Thread t1 = new Thread(r, "线程1");
t1.start();
t1.join();
Thread t2 = new Thread(r, "线程2");
t2.start();
for (int i = 0; i < 1000; i++) {
System.out.println("线程名称:" + Thread.currentThread().getName() + "=====" + i);
}
} catch (Exception e) {
}
}
}
2、后台线程又称为守护线程,JVM垃圾回收就是典型的一个守护线程,守护线程会在所有前台线程死亡后再死亡。使用DaemonThread可以将线程设置为后台线程。
3、线程休眠,调用sleep方法,会将线程变为阻塞状态。
4、线程让步,调用yield方法,会使线程让出CPU进入就绪状态,而不是阻塞当前线程。调用之后其他比当前线程优先级高的线程将会获得CPU。
五、线程的优先级
子线程的优先级默认与其父线程优先级一致,main主线程的优先级为普通优先级,通过Thread的setPriority方法可以设置线程的优先级,范围为1-10.
JAVA线程基础概念及使用的更多相关文章
- Java线程:概念与原理
Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...
- Java多线程--基础概念
Java多线程--基础概念 必须知道的几个概念 同步和异步 同步方法一旦开始,调用者必须等到方法调用返回后,才能执行后续行为:而异步方法调用,一旦开始,方法调用就立即返回,调用者不用等待就可以继续执行 ...
- Java并发基础概念
Java并发基础概念 线程和进程 线程和进程都能实现并发,在java编程领域,线程是实现并发的主要方式 每个进程都有独立的运行环境,内存空间.进程的通信需要通过,pipline或者socket 线程共 ...
- java 线程基本概念 可见性 同步
开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于J ...
- 线程之一:JAVA线程基础
参考core java,马士兵视频 1.线程的基本概念 (1)一个线程是一个程序内部的顺序控制流. (2)线程和进程 –每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大. –线程:轻量 ...
- 线程之一:JAVA线程基础 分类: B1_JAVA 2013-10-10 12:48 662人阅读 评论(0) 收藏
参考core java,马士兵视频 1.线程的基本概念 (1)一个线程是一个程序内部的顺序控制流. (2)线程和进程 –每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大. –线程: ...
- Java 线程基础
Java 线程基础
- Java线程基础知识(状态、共享与协作)
1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...
- Java线程:概念与使用
Java线程大总结 原文章地址:一篇很老的专栏,但是现在看起来也感觉深受启发,知识点很多,很多线程特点我没有看,尴尬.但是还是整理了一下排版,转载一下. 操作系统中线程和进程的概念 在现代操作系统中, ...
随机推荐
- Linux 设置服务开机启动
首先来了解一下 service命令是Redhat Linux兼容的发行版中用来控制系统服务的实用工具,它以启动.停止.重新启动和关闭系统服务,还可以显示所有系统服务的当前状态. service +(自 ...
- react antd 关于selectedRows 的问题
在table中,经常会用到单选和多选的功.这里会有一个方法, 当触发onchange的时候回有两个数组,[selectedRowKeys, selectedRows],当前选中的keys和每一项, 这 ...
- Unity进阶:PlayMaker
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- TypeError: 'in <string>' requires string as left operand, not int
报错 Traceback (most recent call last): File "D:/PyCharm 5.0.3/WorkSpace/2.NLP/9.DL在NLP中的应用/4. Ve ...
- HDU 6346 整数规划 二分图匹配最优解
整数规划 原来的km+hunger跑法T了, 拿了一个新的板子, 新的写法是将这原来的找新的最小的d放在了上一次的残留图上,从而减小复杂度, 但是个人还不是很理解为什么最小的d下一次出现的位置一定是这 ...
- 为什么使用消息队列?消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么优点和缺点?
面试题 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区别,以及适合哪些场景? 面试官心理分析 其实面试官主要是想看看: ...
- Vue源码中compiler部分逻辑梳理(内有彩蛋)
目录 一. 简述 二. 编译流程 三. 彩蛋环节 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 ...
- 【Offer】[66] 【构建乘积数组】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 给定一个数组A[0, 1, -, n-1],请构建一个数组B[0, 1, -, n-1],其中B中的元素B[i] =A[0]×A[1]× ...
- 【Offer】[27]【二叉树的镜像】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 请完成一个函数,输入一颗二叉树,该函数输出它的镜像. 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 ...
- SpringBoot系列__02HelloWorld探究
在前文中,我们创建了一个简单的hello world,现在,利用这个简单的程序,来简单分析一下SpringBoot的启动过程. 如果你是使用过SSM框架的人,尤其是4.0之前的版本,相信你使用过xml ...