您的位置:首页 > 编程语言 > Java开发

Java多线程的使用

2014-04-20 21:31 232 查看
在学习多线程之前我们应该先明确三个问题:

①、什么是线程?

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

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

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

③、多线程的作用?

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

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

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类,所以不能继承其他父类。

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



以上便是线程的使用,根据我们的需求,选择一个中肯的方法创建我们所需的线程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 多线程 Thread 进程