Java多线程的使用

在学习多线程之前我们应该先明确三个问题:

①、什么是线程?

答:当一个程序运行时(进程),内部可能包含多个顺序执行流,每个顺序执行流就是一个线程。

②、线程、进程的关系与不同?

答:线程又称轻量级进程,一个进程中可以包含多个线程。从资源分配角度考虑,进程是系统进行资源分配和调度的一个独立单位,线程则是共享父进程中的全部资源。

③、多线程的作用?

答:多线程可以使程序具有并发性,即同一时间间隔内,线程可以被依次执行,但效果像同时执行一样。


线程的创建形式一共有三种:

1、继承Thread类创建线程类。

//通过继承Thread类来创建线程类
public class MyThread extends Thread {
	//线程共享资源(计数变量)
	private int count;

	@Override
	public void run() {
		for(;count<100;count++){
			System.out.println(getName() + " " + count);
		}
	}
		
	public static void main(String[] args) {
		for(int i=0;i<100;i++){
			System.out.println(Thread.currentThread().getName() + " " + i);		
			if(i == 20) {
				//创建并启动第一个线程
				new MyThread().start();
				//创建并启动第二个线程
				new MyThread().start();
			}
		}
	}

}

运行效果图



2、实现Runnable接口创建线程类。

//通过实现Runnable接口来创建线程类
public class MyThread implements Runnable {
	//线程共享资源(计数变量)
	private int count;

	@Override
	public void run() {
		for (; count < 100; count++) {
			System.out.println(Thread.currentThread().getName() + " " + count);
		}
	}

	public static void main(String[] args) {
		for (int i = 0; i < 100; i++) {
			System.out.println(Thread.currentThread().getName() + " " + i);
			if (i == 20) {
				MyThread mt = new MyThread();
				// 通过new Thread(target , name)方法创建新线程
				new Thread(mt, "线程1").start();
				new Thread(mt, "线程2").start();
			}
		}
	}

}

运行效果图



3、使用Callable和Future创建线程。

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

//实现Callable接口来实现线程类
public class MyThread implements Callable<Integer> {
	private int count;

	//实现call方法,作为线程执行体
	@Override
	public Integer call() throws Exception {
		for(;count<100;count++) {
			System.out.println(Thread.currentThread().getName() + " " +count);
		}
		//call()方法可以有返回值
		return count;
	}

	public static void main(String[] args) {
		//创建Callable对象
		MyThread mt = new MyThread();
		//使用FutureTask来包装Callable对象
		FutureTask<Integer> task1 = new FutureTask<Integer>(mt);
		FutureTask<Integer> task2 = new FutureTask<Integer>(mt);
		for(int i=0;i<100;i++) {
			System.out.println(Thread.currentThread().getName() + " " + i);
			if(i == 20) {
				//实质还是以Callable对象来创建并启动线程
				new Thread(task1,"有返回值的线程1").start();
				new Thread(task2,"有返回值的线程2").start();
			}
		}
		try {
			//获取线程的返回值
			System.out.println("子线程的返回值:" + task1.get());
		} catch(Exception e) {
			e.printStackTrace();
		}
		
	}

}

运行效果图



通过继承Thread类或实现Runnable、Callable接口都可以实现多线程,不过实现Runnable接口与实现Callable接口的方式基本相同,只是Callable接口里定义的方法有返回值,可以声明抛出异常而已。因此可以将实现Runnable接口和实现Callable接口归为一种方式。这种方式与继承Thread方式之间的主要差别如下:


1、实现Runnable、Callable接口的方式创建多线程:

①、线程类只是实现了Runnable接口和Callable接口,还可以继承其他类。

②、多个线程共享一个target对象,所以非常适合多个线程来处理同一份资源的情况。


2、采用继承Thread类的方式创建多线程:

①、线程类以继承了Thread类,所以不能继承其他父类。

②、每个线程都是一个独立的对象,适合处理不共享资源的情况。


以上便是线程的使用,根据我们的需求,选择一个中肯的方法创建我们所需的线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值