Java教程

java创建线程的四种方式

本文主要是介绍java创建线程的四种方式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

线程的创建和启动


1.继承Thread来创建线程

public class Demo extends Thread
{
    private xx;
    public void run()
    {
        //这个线程要执行的东西
        .......
    }
    
	public static void main(String []__)
    {
        Demo th=new Demo();
        th.start();
    }
}

这样就算是创建了一个线程

两个方法介绍

  • Thread中的currentThread(),返回当前正在运行的线程
  • getName(),返回线程名字
  • 创建的时候,传递进去string类型的参数当做线程名字

2.实现Runnable类来作为参数传递

class A extends Runnable
{
    private int age;//共同的field
    public void run()
    {
    	....    
    }
	public static void main(String[]__)
    {
        A paremeter = new A();
        Thread test=new Thread(paremeter);
        test.start();
        Thread other=new Thread(paremeter);
        other.start();
        //如果我们的run里面对于共享的变量age做出了修改,其实这两个线程中,field是相同的,可能会造成共享的数据出现访问冲突,可以考虑使用volatile关键字
    }
}

3.使用Callable和Future来创建线程(jdk1.5加入)

步骤如下:

  • 创建callable接口的实现类,并且实现call()方法,这个call()方法将作为线程的执行体
  • 创建实现类的实例,使用Futuretask类来保证Callable对象,这个FutureTask对象封装了该Callable对象call方法的返回值,也就是线程的执行体可以有返回值了
  • 将FutureTask对象作为thread的target,创建并且启动线程。
  • 使用 FutureTask对象的get方法获得子线程执行结束之后返回的数值
package thread;

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

public class CallableDemo implements Callable<Integer>
{

	@Override
	public Integer call() throws Exception {
		int i=0;
		for(;i<99;i++)
		{
			System.out.println(i+"  "+Thread.currentThread().getName());
		}
		return i;
	}
	public static void main(String[]__)
	{
		//创建callable对象
		CallableDemo rt=new CallableDemo();
		//把callable绑定到FutureTask对象上面
		FutureTask<Integer> task=new FutureTask<>(rt);
		//把任务加入thread的target中去
		new Thread(task).start();
		try {
			System.out.println(task.isDone()+" "+task.get());
		} catch (InterruptedException | ExecutionException e) {
			e.printStackTrace();
		}
		new Thread(task).start();
		try {
			System.out.println(task.isDone()+" "+task.get());
		} catch (InterruptedException | ExecutionException e) {
			e.printStackTrace();
		}
		//他们的field也是只有一块,一个线程跑完会修改field中的数值
	}
}

优点:

  • 具有返回值
  • 可以抛出异常

缺点:

  • 使用get方法得到返回值可能抛出异常,线程可能没有执行完毕
  • get()方法会阻塞主线程,直到all方法返回

4.匿名方式创建线程(与Runnable同)

	new Thread(new Runnable() {
			private int i=0;
			@Override
			public void run() {
			System.out.println(i);
				
			}
		},String.valueOf("1")).start();

优点

  • 方便快捷

缺点

  • 复用性低
这篇关于java创建线程的四种方式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!