Java多线程之旅(一)
来源:互联网 发布:淘宝夏宽 编辑:程序博客网 时间:2024/06/02 05:59
1.基本概念:程序-进程-线程
- 程序:为完成特定任务、用某种语言编写的一组指令集合。是进程运行的静态描述文本。
- 进程:是程序的一次动态执行过程,有自己的生命周期。是系统进行资源分配和调度的一个独立单位。当程序进入内存运行时,即为进程。
- 线程:是进程的组成部分,CPU调度的基本单位,是程序内部的一条执行路径。一个进程可以拥有多个线程,而一个线程必须拥有一个父进程。线程可以拥有自己的程序计数器、寄存器、堆、栈和帧等;但不能拥有系统资源,它与父进程的其他线程共享该进程的所有资源。
2.线程的特点
- 线程是独立运行的,其不知道进程中是否还有其他线程存在。
- 线程的执行是抢占式的,也就是说,当前执行的线程可能随时被挂起,以便运行其他线程。
- 一个线程可以创建或撤销另一个线程,一个进程中可以有多个线程并发执行。
- 线程可以完成一定任务,可以和其它线程共享父进程的共享变量和部分环境,相互协作来完成任务。
3.线程的创建及使用
- 方案一:继承Thread类,重写该类run方法,该run方法中的方法体代表了该线程需要完成的任务。调用start方法来启动该线程。
public class SubThread extends Thread {private int num;@Overridepublic void run() {for (; num < 4; num++) {System.out.println(Thread.currentThread().getName() + ":" + num);}}}
public class SubThreadTest {public static void main(String[] args) {SubThread primaryThread1 = new SubThread();SubThread primaryThread2 = new SubThread();primaryThread1.setName("子线程1");primaryThread1.start();primaryThread2.setName("子线程2");primaryThread2.start();}}
- 方案二:实现Runnable接口,重写run方法。将Runnable接口的实现类作为参数传入到Thread类的构造函数中,创建Thread类对象,该对象即为线程对象,并调用start方法启动该线程。
public class RunnableExample01 implements Runnable {private int num = 10;@Overridepublic void run() {num--;System.out.println(Thread.currentThread().getName() + ":" + num);}}
public class RunnableExample01Test {public static void main(String[] args) {Runnable target = new RunnableExample01();Thread thread1 = new Thread(target);thread1.setName("子线程1");thread1.start();Thread thread2 = new Thread(target);thread2.setName("子线程2");thread2.start();}}实现Runnable接口,创建Thread类对象时,使用此构造函数Thread(Runnable target)。当多个线程传入的是同一个Runnable接口实现类时,线程之间可以共享Runnable接口实现类中的实例变量。
- 方案三:通过Callable<V>接口和Future<V>接口创建线程
public class CallableExample implements Callable<Integer> {private Integer num = 100;@Overridepublic Integer call() throws Exception {for (int i = 0; i < num; i++) {num--;System.out.println(Thread.currentThread().getName() + ":" + num);}return num;}}
public class CallableExampleTest {public static void main(String[] args) throws InterruptedException, ExecutionException {Callable<Integer> callable = new CallableExample();FutureTask<Integer> target1 = new FutureTask<>(callable);FutureTask<Integer> target2 = new FutureTask<>(callable);Thread thread1 = new Thread(target1, "子线程1");thread1.start();Thread thread2 = new Thread(target2, "子线程2");thread2.start();System.out.println("子线程1--call方法返回值:" + target1.get());System.out.println("子线程2--call方法返回值:" + target2.get());}}
阅读全文
0 0
- Java多线程之旅(一)
- (一)java多线程之Thread
- java多线程(一) 之 简介
- (一)java多线程之Thread
- [多线程之旅] 一、初识多线程
- Java多线程之syncronized(一)
- Java多线程之线程池(一)
- Java多线程之信号量(一)
- Java多线程之线程锁(一)
- Java多线程之Callable接口(一)
- Java多线程之Exchanger(一)
- Java多线程之CyclicBarrier(一)
- Java多线程之Condition(一)
- Java多线程之BlockingQueue(一)
- Java多线程之Thread(一)
- Java多线程之CountDownLatch(一)
- java之学习多线程(一)
- Java多线程 之 Runnable Thread (一)
- 多级指针的应用一(字符串的切割)
- IOS应用如何模糊(blur)图片
- java面试题--已知先序和中序遍历求后序遍历
- (扩展欧几里得)Modular Inverse--Zoj
- Logistic的损失函数的推导.
- Java多线程之旅(一)
- Vue.js指令
- 遍历数组
- Unity计算两点之间的距离或者向量的长度常用方法
- 安卓 使用点击事件完成双击效果的简单写法
- Struts2 入门
- Windows10下C# 使用EmguCV3.2 读取本机摄像头
- 安卓include文件踩过的坑
- python正则表达式