多线程的三种使用方法

(初学java,个人见解,不一定正确)
第一种

package Thread;
//创建线程的第一种方法,继承Thread,重写run方法
public class ThreadOne extends Thread{

@Override
public void run(){//虚拟机执行此线程时调用,方法中放要处理任务(要执行的代码)
	System.out.println("线程抢到CPU资源,开始执行,做某一项任务");
	System.out.println(Thread.currentThread().getPriority());
	System.out.println(Thread.currentThread().getState());//输出当前线程的状态
	//Thread.currentThread()获得当前正在执行的线程,getState()获得线程的状态
	for (int i = 0; i < 10; i++) {
		try {
			Thread.sleep(2000);//让当前线程休眠多长时间,毫秒;让出2000毫秒的时间不去跟别人抢,休眠结束后继续抢CPU
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName()+"循环下标:"+i);
	}
}
public static void main(String[] args) throws InterruptedException {
	//main方法是java程序的入口,main方法会启动一个主线程
	System.out.println(Thread.currentThread().getName());
	Thread.currentThread().setPriority(10);//设置线程优先级
	
	ThreadOne one=new ThreadOne();//创建线程对象
	one.setName("线程1");//给线程设置名字
	System.out.println("线程1创建完成,还未start");
	
	one.start();//启动线程,并不一定立马执行run,只有当此线程抢到CPU资源的时候才能执行
	//开始跟上面main线程抢CPU资源,谁抢到资源,谁就执行
	
	for (int i = 0; i < 10; i++) {//main线程中要输出10次循环
		Thread.sleep(1000);//让main线程休眠1秒,不跟别的 线程抢资源
		System.out.println(Thread.currentThread().getName()+i);
	}
	
	System.out.println(one.getState());
	Thread.currentThread().sleep(500);
	
	one.stop();
	System.out.println(one.getState());
	
	System.out.println(Thread.currentThread().getName()+"优先级:"+Thread.currentThread().getPriority());
	/*System.out.println();*/
  }
}

第二种

package Thread;
//创建线程的第二种方法,实现Runnable接口,重写run方法
public class ThreadTwo implements Runnable{
private String name="abc";

@Override
public void run() {//虚拟机执行此线程时调用,方法中放要处理任务(要执行的代码)
	// TODO Auto-generated method stub
	System.out.println("线程执行,做某一项任务");
	for (int i = 0; i < 10; i++) {
		try {
			Thread.sleep(500);//让前线程休眠多长时间,毫秒;让出500毫秒的时间不去跟别人抢,休眠结束后继续抢CPU
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}//Thread.currentThread()获取当前正在执行的线程
		System.out.println(Thread.currentThread().getName()+"循环下标:"+i);
	}
}

public static void main(String[] args) {
	ThreadTwo th=new ThreadTwo();//Runnable接口实现类的实例
	
	Thread a=new Thread(th,"线程A");//灵活
	Thread b=new Thread(th,"线程B");
	Thread c=new Thread(th,"线程C");
	Thread d=new Thread(th,"线程D");
	
	a.start();
	b.start();
	c.start();
	d.start();
}

}

第三种

package Thread;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**
* 创建线程的第三种方式:
* Runnable run方法无返回值,不能直接获得线程执行的结果,不能抛异常
* 
* 1.定义一个线程任务类实现Collable接口,申明线程执行的结果类型
* 2.重写线程任务类的call方法,这个方法可以直接返回执行的结果
* 3.创建一个Callable线程任务对象
* 4.把Callable的线程任务对象包装成一个未来任务对象
* 5.把未来任务对象包装成线程对象,调用线程的start方法启动线程
* 6.通过FutureTask对象的get方法取线程执行结果后的返回结果
* 
* 优点:
* 可以继承其他的类,同时可以继承实现其他接口
* 一个线程任务对象可以被共享成多个线程对象,适合做多线程的资源共享操作
* 很适合做线程池的执行任务,可以获得线程执行的结果
* 缺点:
* 编程复杂
*/
//public class ThreadThree implements Runnable{
public class ThreadThree implements Callable<String>{//1.定义一个线程任务类实现Collable接口,申明线程执行的结果类型

@Override
public String call() throws Exception {//2.重写线程任务类的call方法,这个方法可以直接返回执行的结果
	// TODO Auto-generated method stub
	int sum = 0;
	for (int i = 0; i < 10; i++) {
		System.out.println(Thread.currentThread().getName()+":"+i);
		sum+=i;//55
	}
	return "Callable的call方法返回值为:"+String.valueOf(sum);
}

public static void main(String[] args) {
	Callable call = new ThreadThree();// 3.创建一个Callable线程任务对象
	
	//把callable对象包装成未来任务对象,是一个runnable对象,可以在线程执行完成后获取线程执行结果
	FutureTask<String> task_Runnable = new FutureTask<String>(call);//4.把Callable的线程任务对象包装成一个未来任务对象
	
	//重点:不管是第一,第二种,还是第三种方式创建线程,都离不开Thread类!线程都是一个Thread对象
	Thread thread = new Thread(task_Runnable,"线程3");//5.把未来任务对象包装成线程对象
	
	thread.start();//5.调用线程的start方法启动线程
	
	//在最后获取线程执行结果,如果线程没有结果,会让出CPU等线程执行完,再来取结果
	try {
		//6.通过FutureTask对象的get方法取线程执行结果后的返回结果
		String s = task_Runnable.get();//获取call方法返回的结果(正常/异常结果)
		System.out.println(s);
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}
}

版权声明:本文为K15072450928原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。