多线程基础篇

首先感谢黑马视频,本文摘自黑马视频多线程学习笔记。

Day01:多线程基础篇

 

课程目标

  • 什么是并发与并行
  • 什么是进程与线程
  • 线程创建
  • 线程生命周期
  • 线程安全问题
  • 什么是线程安全问题
  • 线程安全问题解决方案
  • 线程死锁
  • 死锁必要条件
  • 如何避免死锁
  • 线程通讯

什么是并发与并行

要想学习多线程,必须先理解什么是并发与并行

并行:指两个或多个事件在同一时刻发生(同时发生)。

并发:指两个或多个事件在同一个时间段内发生。

什么是进程、线程

进程:

进程是正在运行的程序的实例。

进程是线程的容器,即一个进程中可以开启多个线程。

比如打开一个浏览器、打开一个word等操作,都会创建进程。

线程:

线程是进程内部的一个独立执行单元;

一个进程可以同时并发运行多个线程;

比如进程可以理解为医院,线程是挂号、就诊、缴费、拿药等业务活动

多线程:多个线程并发执行。

线程创建

Java中线程有四种创建方式:

  1. 继承Thread类
  2. 实现Runnable接口
  3. 实现Callable接口
  4. 线程池
  • 继承Thread类

第一步:创建自定义线程类

package com.herman;

import java.util.Date;

public class MyThread extends Thread {
	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println("mythread线程正在执行:" + new Date().getTime());
		}
	}
}

第二步:创建测试类

package com.herman;

import java.util.Date;

public class ThreadCreateDemo {
	public static void main(String[] args) {
		//1.创建自定义线程
		MyThread thread = new MyThread();
		thread.start();
		//2.主线程循环打印
		for (int i = 0; i < 100; i++) {
			System.out.println("main主线程正在执行:" + new Date().getTime());
		}
	}
}

执行效果如下:

  • 实现Runnable接口

第一步:创建自定义类实现Runnable接口

package com.herman;

import java.util.Date;

public class MyRunable implements Runnable {
public void run() {
for (int i=0; i<100; i++){
            System.out.println("MyRunnable线程正在执行:"+new Date().getTime());
        }
    }
}

第二步:创建测试类

package com.herman;

import java.util.Date;

public class ThreadCreateDemo {
	public static void main(String[] args) {
		//1.创建自定义线程
		Thread thread = new Thread(new MyRunable());
		thread.start();
		//2.主线程循环打印
		for (int i = 0; i < 100; i++) {
			System.out.println("main主线程正在执行:" + new Date().getTime());
		}
	}
}

执行效果如下:

  • 实现Callable接口

FutureTask介绍

Callable需要使用FutureTask类帮助执行,FutureTask类结构如下:

Future接口:

判断任务是否完成:isDone()

能够中断任务:cancel()

能够获取任务执行结果:get()

第一步:创建自定义类实现Callable接口

package com.herman;

import java.util.Date;
import java.util.concurrent.Callable;

public class MyCallable implements Callable<String> {
	public String call() throws Exception {
		for (int i = 0; i < 100; i++) {
			System.out.println("MyCallable正在执行:" + new Date().getTime());
		}
		return "MyCallable执行完毕!";
	}
}

第二步:创建测试类

package com.herman;

import java.util.Date;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class ThreadCreateDemo {
	public static void main(String[] args) throws ExecutionException, InterruptedException {
		FutureTask task = new FutureTask(new MyCallable());
		Thread thread = new Thread(task);
		thread.start();

		for (int i = 0; i < 100; i++) {
			System.out.println("main主线程正在执行:" + new Date().getTime());
		}
		System.out.println(task.get());
	}
}

运行效果图如下:

-----------------------------------------------------

太晚了,今晚先记录到这里。明天继续。

猜你喜欢

转载自blog.csdn.net/cyberHerman/article/details/101038804