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());}}




原创粉丝点击