java中创建线程的几种方式


1.方式一: 继承Thread类

实现: 自定义类继承Thread类,重写其run方法,将需要执行的代码放到run方法中去

class ThreadTest extends Thread{
    @Override
    public void run() {
        //线程代码
        System.out.println("线程执行了...");
    }
}

使用: 创建对象并调用其start方法

new ThreadTest().start()

2.方式二: 实现Runnable接口

实现: 自定义类实现Runnable接口,实现其run方法,将需要执行代码放到run方法中去

class ThreadTest implements Runnable{
    @Override
    public void run() {
        //线程代码
        System.out.println("线程执行了...");
    }
} 

使用: 将自定义类对象作为参数传入Thread类对象中去,然后调用Thread类对象的start方法

new Thread(new ThreadTest()).start()

3.方式三: 匿名内部类

实现: 本质同1,2

//1.继承Thread方式
new Thread(){
    @Override
    public void run() {
        while(true){
          System.out.println("Thread Success!");  
        }
    }
}.start();
//2.实现Runnable接口方式
new Thread(new Runnable() {
    @Override
    public void run() {
        while(true){
            System.out.println("Runnable Success!");
        }
    }
}).start();

4.方式四: 带返回值的线程

实现: 自定义类实现Callable接口,实现其call方法,可带返回值

class CallableTask implements Callable<Integer>{
    @Override
    public Integer call() throws Exception {
        System.out.println("正在计算...");
        return 1;
    }
}

使用: 将自定义类对象作为参数传递

CallableTask ct = new CallableTask();
FutureTask<Integer> ft = new FutureTask<Integer>(ct);
new Thread(ft).start();  //执行线程
Integer result = null;
try {
     result = ft.get();   //获取线程执行的返回值
}catch (Exception e){
}
System.out.println("计算结果为: "+ result);

5.方式五: Timer(定时器)

使用: 创建Timer对象,然后执行其schedule(时刻表)方法

public void TimerTest(){
    Timer timer = new Timer(); //创建一个定时器对象
    timer.schedule(new TimerTask() {
        @Override
        public void run() {     //线程任务
            System.out.println("TImerTask is run ...");
        }
    },0,1000);    //0秒后执行,毎1000毫秒执行一次线程任务
}

6.方式六: 线程池

使用: 根据不同需求创建不同的线程池对象, 例如:

  • Executors.newFixedThreadPool(10)创建固定线程数的线程池
  • Executors.newCachedThreadPool()创建一个运行时自动扩充线程数的线程池
public void ThreadPoolTest(){
    Executor threadPool = Executors.newCachedThreadPool();  //创建一个线程池(自动分配线程个数,不够用时自动创建)
    //Executor threadPools = Executors.newFixedThreadPool(10);  //创建一个线程数固定大小(10)的线程池
    for(int i=0;i<100;i++){
        threadPool.execute(new Runnable() {         //将线程任务分配给线程池中的线程执行
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"执行了...");
            }
        });
    }

}

7.方式七: spring对多线程的支持

连接地址

8.方式八: lambda表达式(jdk8)

简单介绍

//并行计算
public int lambdaAdd(ArrayList<Integer> nums){
    //并行计算集合nums进行求和
    return nums.parallelStream().mapToInt(i -> i).sum();
    //parallelStream为并发流
}
//并行输出
public void lambdPrint(ArrayList<Integer> nums){
   //并行输出集合nums的值
   nums.parallelStream().forEach(System.out::println);
}

测试

@Test
public void test(){
    ArrayList<Integer> values = new ArrayList<Integer>();
    values.add(10);
    values.add(20);
    values.add(40);
    values.add(30);
    lambdPrint(values);
    System.out.println("result: "+ lambdaAdd(values));
}

文章作者: Bryson
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Bryson !
评论
 上一篇
本篇 
  目录