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线程大总结 原文章地址:一篇很老的专栏,但是现在看起来也感觉深受启发,知识点很多,很多线程特点我没有看,尴尬.但是还是整理了一下排版,转载一下. 操作系统中线程和进程的概念 在现代操作系统中, ...
随机推荐
- 数据的查找和提取[2]——xpath解析库的使用
xpath解析库的使用 在上一节,我们介绍了正则表达式的使用,但是当我们提取数据的限制条件增多的时候,正则表达式会变的十分的复杂,出一丁点错就提取不出来东西了.但python已经为我们提供了许多用于解 ...
- JAVA 泛型中的通配符 T,E,K,V,?
前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据 ...
- 业务代码的救星——Java 对象转换框架 MapStruct 妙用
简介 在业务项目的开发中,我们经常需要将 Java 对象进行转换,比如从将外部微服务得到的对象转换为本域的业务对象 domain object,将 domain object 转为数据持久层的 dat ...
- Java内部类使用注意事项
Java内部类使用注意事项: 1. 非静态内部类成员可以访问外部类实例成员 (如注释1),但外部类访问非静态内部类的成员 必须创建非静态内部类对象来访问其成员,如注释2 public class La ...
- 第6章 事务管理 6.1 spring事务
事务管理——原子性.一致性.隔离性.持久性 理解spring对事务管理的支持 Spring提供对编码式和声明式事务管理的支持.编码式事务允许用户在代码中精确定义事务的边界,而声明式事务(基于AOP,面 ...
- HDU 3062 Party 裸 2-sat
#include <iostream> #include <cstdio> #include <cstring> using namespace std; cons ...
- codeforces 872 D. Something with XOR Queries(思维)
题目链接:http://codeforces.com/contest/872/problem/D 题意:给你一个排列p和对应的位置b也就是说p[b[i]]=i,然后给你最多询问2*n次找出所有的p排列 ...
- CF994B Knights of a Polygonal Table 第一道 贪心 set/multiset的用法
Knights of a Polygonal Table time limit per test 1 second memory limit per test 256 megabytes input ...
- 字符串的api
一.基础 1.字符串.charAt(index) 根据下标获取字符串的某一个字符 应用: 判断字符串的首字母是否大写 任意给定的一串字母,统计字符串里面的大写字母和小写字母的个数 2.字符串.inde ...
- Scrum团队的最佳规模?
无论你在小型创业公司工作还是在大公司的新产品线工作,当团队人数越来越多时总会达到一个临界点.尽早识别这个临界点可以让您的团队避免进入低效阶段.每个产品都是不同的,团队合作也是如此.因此,拆分团队也需要 ...