Java多线程的使用

来源:互联网 发布:windows版icloud 编辑:程序博客网 时间:2024/05/22 08:29

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

①、什么是线程?

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

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

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

③、多线程的作用?

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


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

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

//通过继承Thread类来创建线程类public class MyThread extends Thread {//线程共享资源(计数变量)private int count;@Overridepublic 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;@Overridepublic 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方法,作为线程执行体@Overridepublic 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
原创粉丝点击