java中的多线程

单线程

1.实现Runnable接口

public class RunnableTest implements Runnable {

    public static void main(String[] args) {
        RunnableTest t = new RunnableTest();
        new Thread(t, "a--").start();
    }

    @Override
    public void run() {
        System.out.println("RunnableTest");
    }

}

2.继承Thread

public class ThreadTest extends Thread {

    public ThreadTest(String s) {
        super(s);
    }

    public static void main(String[] args) {
        new ThreadTest("a--").start();
    }

    public void run() {
        System.out.println("ThreadTest");
    }
    
}

线程池

1.ThreadPoolExecutor基础的线程池

public class ThreadPoolExecutorTest {
    
    public static void main(String[] args) {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 20, 20, TimeUnit.SECONDS, new LinkedBlockingQueue<>(500));
    }

}

2.ScheduledThreadPoolExecutor定时任务线程池

public class ScheduledThreadPoolExecutorTest {

    public static void main(String[] args) {
        ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
        executor.scheduleAtFixedRate(() ->
        {
            System.out.println(2);
        }, 1, 2, TimeUnit.SECONDS);//第一次1s,周期2s
    }
    
}

3.ThreadPoolTaskExecutor线程池由spring提供

 

@Configuration
@EnableAsync
public class ThreadPoolTaskExecutorConfig {

    @Bean("taskExecutor")
    public Executor taskExecutro() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(10);
        taskExecutor.setMaxPoolSize(50);
        taskExecutor.setQueueCapacity(200);
        taskExecutor.setKeepAliveSeconds(60);
        taskExecutor.setThreadNamePrefix("taskExecutor:");
        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        taskExecutor.setAwaitTerminationSeconds(60);
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        taskExecutor.initialize();
        return taskExecutor;
    }

}

多线程

1.CountDownLatch阻塞直到最慢的线程执行完成

public class CountDownLatchTest {

    public static void main(String[] args) throws InterruptedException {
        List<Object> list = new ArrayList<>();
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 20, 20, TimeUnit.SECONDS, new LinkedBlockingQueue<>(500));
        CountDownLatch countDownLatch = new CountDownLatch(2);
        threadPoolExecutor.execute(() -> {
            try {
                list.add("test1");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                countDownLatch.countDown();
            }
        });

        threadPoolExecutor.execute(() -> {
            try {
                list.add("test2");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                countDownLatch.countDown();
            }
        });

        countDownLatch.await(3, TimeUnit.SECONDS);
        threadPoolExecutor.shutdown();

        System.out.println(list);
    }

}

2.Semaphore每次指定几个线程完成任务

public class SemaphoreTest {

    public static void main(String[] args) {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 20, 20, TimeUnit.SECONDS, new LinkedBlockingQueue<>(500));
        Semaphore semaphore = new Semaphore(2);
        for (int i = 0; i < 5; i++) {
            threadPoolExecutor.execute(() -> {
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + ":aquire() at time:" + System.currentTimeMillis());
                    Thread.sleep(1000);
                    semaphore.release();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
    }

}

3.CyclicBarrier在指定的线程数量完成后执行run方法

public class CyclicBarrierTest {

    public static void main(String[] args) {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 20, 20, TimeUnit.SECONDS, new LinkedBlockingQueue<>(500));
        final CyclicBarrier cb = new CyclicBarrier(3, new Runnable() {
            @Override
            public void run() {
                System.out.println("执行CyclicBarrier方法");
            }
        });
        for (int i = 1; i < 5; i++) {
            threadPoolExecutor.execute(() -> {
                try {
                    String name = Thread.currentThread().getName();
                    Thread.sleep(1000);
                    System.out.println("线程" + name + "即将到达集合地点1,当前已有" + cb.getNumberWaiting() + "个已经到达,正在等候");
                    cb.await();//到此如果没有达到公共屏障点,则该线程处于等待状态,如果达到公共屏障点则所有处于等待的线程都继续往下运行
                    Thread.sleep(1000);
                    System.out.println("线程" + name + "即将到达集合地点2,当前已有" + cb.getNumberWaiting() + "个已经到达,正在等候");
                    cb.await();    //这里CyclicBarrier对象又可以重用
                    Thread.sleep(1000);
                    System.out.println("线程" + name + "即将到达集合地点3,当前已有" + cb.getNumberWaiting() + "个已经到达,正在等候");
                    cb.await();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
        threadPoolExecutor.shutdown();
        System.out.println("结束");
    }

}

其他

1.Exchanger交换两个线程数据

public class ExchangerTest {
  
    public static void main(String[] args) {  
        // 创建一个Exchanger对象,用于交换数据  
        Exchanger<String> exchanger = new Exchanger<>();
  
        // 创建并启动第一个线程,它将携带数据"Data from Thread 1"进行交换  
        Thread producer = new Thread(() -> {  
            try {  
                String producedData = "Data from Thread 1";  
                String consumerData = exchanger.exchange(producedData);  
                System.out.println("Thread 1 received: " + consumerData);  
            } catch (InterruptedException e) {  
                Thread.currentThread().interrupt();  
                System.err.println("Thread 1 was interrupted");  
            }  
        });  
  
        // 创建并启动第二个线程,它将携带数据"Data from Thread 2"进行交换  
        Thread consumer = new Thread(() -> {  
            try {  
                String producedData = "Data from Thread 2";  
                // 为了让示例更清晰,让第二个线程稍微延迟一会儿,确保第一个线程先到达交换点  
                Thread.sleep(100);  
                String producerData = exchanger.exchange(producedData);  
                System.out.println("Thread 2 received: " + producerData);  
            } catch (InterruptedException e) {  
                Thread.currentThread().interrupt();  
                System.err.println("Thread 2 was interrupted");  
            }  
        });  
  
        // 启动线程  
        producer.start();  
        consumer.start();  
    }  
}

2.Callable获取线程返回值

public class CallableTest {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 20, 20, TimeUnit.SECONDS, new LinkedBlockingQueue<>(500));
        List<Future> list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            Callable callable = new Callable() {
                @Override
                public Object call() throws Exception {
                    return new Date().toLocaleString();
                }
            };
            // 执行任务并获取Future对象
            Future f = threadPoolExecutor.submit(callable);
            list.add(f);
        }
        threadPoolExecutor.shutdown();
        // 获取所有并发任务的运行结果
        for (Future f : list) {
            // 从Future对象上获取任务的返回值,并输出到控制台
            System.out.println("Future" + f.get().toString());
        }
    }

}

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java多线程实现的原理主要是通过线程对象的创建和启动来实现的。Java实现多线程的方式有四种:继承Thread类、实现Runnable接口、实现Callable接口、使用线程池。下面分别介绍这四种方式的实现原理: 1. 继承Thread类 继承Thread类是实现多线程的一种方式,它的实现原理是创建一个继承自Thread类的子类,并重写run()方法,在run()方法编写线程执行的代码。然后创建该子类的对象,并调用start()方法启动线程。 2. 实现Runnable接口 实现Runnable接口是实现多线程的另一种方式,它的实现原理是创建一个实现了Runnable接口的类,并实现run()方法,在run()方法编写线程执行的代码。然后创建该类的对象,并将其作为参数传递给Thread类的构造方法,最后调用start()方法启动线程。 3. 实现Callable接口 实现Callable接口是实现多线程的一种方式,它的实现原理是创建一个实现了Callable接口的类,并实现call()方法,在call()方法编写线程执行的代码。然后创建该类的对象,并将其作为参数传递给FutureTask类的构造方法,最后调用start()方法启动线程。 4. 使用线程池 使用线程池是实现多线程的一种方式,它的实现原理是创建一个线程池对象,并将任务提交给线程池执行。线程池会自动管理线程的创建和销毁,从而避免了频繁创建和销毁线程的开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值