多线程---基础篇(二)

简介: 多线程---基础篇

Callable接口


步骤


实现callable接口,需要返回值类型

重写call方法,需要抛出异常

创建目标对象

创建执行服务:ExecutorService ser=Executors.newFixedThreadPool(3); //3个线程

提交执行:Future result1=ser.submit(t1);

获取结果:boolean r1=result1.get()

关闭服务:ser.shutdownNow()

好处:

可以定义返回值

可以抛出异常


代码示例


public class TestCallable implements Callable<Boolean> {
    private String url;//网络图片地址
    private String name;//保存文件名称
    public TestCallable (String url,String name){
        this.url=url;
        this.name=name;
    }
    //下载图片线程的执行体
    @Override
    public Boolean call() throws Exception {
        WebDownloader webDownloader=new WebDownloader();
        webDownloader.downloader(url,name);
        System.out.println("下载了文件名为:"+name);
        return true;
    }
    public static void main(String[] args) {
        TestCallable t1=new TestCallable("url地址","1.jpg");
        TestCallable t2=new TestCallable("url地址","1.jpg");
        TestCallable t3=new TestCallable("url地址","1.jpg");
        //创建执行服务
        ExecutorService ser=Executors.newFixedThreadPool(3);
        //提交执行
        Future<Boolean> r1=ser.submit(t1);
        Future<Boolean> r2=ser.submit(t1);
        Future<Boolean> r3=ser.submit(t1);
        //关闭服务
        ser.shutdownNow();
    }
}


多线程代码实例----龟兔赛跑


龟兔赛跑实例


public class Race implements Runnable{
    //胜利者
    private static String winner;
    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            //模拟兔子睡觉
            if(Thread.currentThread().getName().equals("兔子") && i%10==0){
                try{
                    Thread.sleep(1);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
            //判断比赛是否结束
            boolean flag=gameOver(i);
            //如果比赛结束了,就停止程序
            if(flag){
                break;
            }
            System.out.println(Thread.currentThread().getName()+"===>跑了"+i+"步");
        }
    }
//判断是否完成比赛
    private boolean gameOver(int steps){
        //判断是否由胜利者
        if(winner!=null){
            return true;
        }{
            if(steps>=100){
                winner=Thread.currentThread().getName();
                System.out.println("winner is"+winner);
                return false;
            }
        }
        return false;
    }
    public static void main(String[] args) {
        Race race = new Race();
        new Thread(race,"兔子").start();
        new Thread(race,"乌龟").start();
    }
}


d038476afb86ca0ca45e11b06fbd1dd7_e7a8f0dd2a2d44c1ba90cae122f9dc4d.png


总结


线程与进程的区别

进程是资源分配的最小单位,线程是CPU调度的最小单位。

一个进程包含一个或多个线程,它们共享进程的资源。

线程更轻量级,切换开销更小。

线程的基本使用

继承Thread类或者实现Runnable接口来创建线程类。

使用start()方法启动线程,而不是直接调用run()。

可以给线程设置优先级、守护线程等。

线程安全与同步

多线程访问共享资源需要考虑线程安全问题。

使用synchronized关键字或者Lock接口来对关键代码段加锁,保证同一时刻只有一个线程执行。

线程通信

wait/notify/notifyAll可以实现不同线程之间的通信。

join方法可以等待其他线程结束。

线程池的使用

线程池可以重用固定数量的线程,避免频繁创建销毁。

使用Executor框架中的线程池可以更好地控制线程池的属性。

常见的多线程问题

死锁、活锁、饥饿等问题及定位与解决。

以上是对多线程的一个基本认识,后续会持续更新~~

有不同见解可以指出一起学习~


相关文章
|
7月前
|
C#
C#学习相关系列之多线程---ConfigureAwait的用法
C#学习相关系列之多线程---ConfigureAwait的用法
128 0
|
7月前
|
C#
C#学习相关系列之多线程---TaskCompletionSource用法(八)
C#学习相关系列之多线程---TaskCompletionSource用法(八)
201 0
|
7月前
|
算法 小程序 Java
多线程与并发编程【多线程与并发编程、 进程、线程的区别、 线程的创建】(一)-全面详解(学习总结---从入门到深化)
多线程与并发编程【多线程与并发编程、 进程、线程的区别、 线程的创建】(一)-全面详解(学习总结---从入门到深化)
94 1
|
7月前
|
Java
[并发编程基础] Java线程的创建方式
[并发编程基础] Java线程的创建方式
|
7月前
|
C#
C#学习系列相关之多线程(二)----Thread类介绍
C#学习系列相关之多线程(二)----Thread类介绍
|
并行计算 安全 调度
多线程---基础篇(一)
多线程---基础篇
107 0
|
调度 双11
多线程的创建方法--多线程基础(一)
线程为一个"执行流". 每个线程之间都可以按照自己的顺序执行.
|
Java C++
高并发编程-Daemon Thread的创建以及使用场景分析
高并发编程-Daemon Thread的创建以及使用场景分析
114 0
|
存储 Linux Shell
【Linux】多线程 --- 线程概念 控制 封装-2
【Linux】多线程 --- 线程概念 控制 封装-2
|
存储 缓存 算法
【Linux】多线程 --- 线程概念 控制 封装-1
【Linux】多线程 --- 线程概念 控制 封装-1