《JAVA核心技术卷·I》——第十二章2——创建两个并发线程——《并发》

🌈hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。

✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!

🔥个人主页:Ethan Yankang
🔥推荐:史上最强八股文||一分钟看完我的几百篇博客

🔥温馨提示:划到文末发现专栏彩蛋   点击这里直接传送

🔥本篇概览:详细讲解了如何构建两个并发线程并执行指定任务。以此引出了线程的构建三大步。🌈⭕🔥


【计算机领域一切迷惑的源头都是基本概念的模糊,算法除外】


目录

🌈序言:

🌈引出:

🌈创建两个并发线程

🔥task1&&task2

🔥Bank类:

🔥执行结果:​编辑

🌈详细解释上面程序

🌈在一个单独的线程中运行一个简单的任务:

🌈三大步:

1.在Runnable里面定义了将来用此run启动的线程将要执行的任务。

2.以这个实现了 Runnable接口的变量为参数,构造一个 Thread 对象:

🔥3.启动线程

🌈今日总结 

🌈定义线程并执行就三大步:


🌈序言:

JAVA基础必序扎实的一批,此关不过,啥都没有。今日得《JAVA核心技术·卷I》之良品辅助,应按本书学之习之,时时复习,长此以往必能穿魂入脉,习得大功。

感谢Cay S. Horstmann给世界留下如此优美的作品。

对于一个强烈想完全掌握JAVA的技术宅来说,JAVA的XXX万万不能放过,这些基础的概念例程都值得细细体味的,千万别觉得都是文字,浪费时间,记住——别违背科学发展的客观规律。别一味地赶进度以满足自己学的都么快的虚荣心,自欺欺人,要老老实实的走好每一步。

上一篇文章详细讲解了XX,建议先将这部分知识掌握之后再来学习本篇内容,点击查看。


🔥《JAVA核心技术卷·I》——第十二章1——什么是线程?舞台剧(最优美的比喻)——《并发》-CSDN博客

🔥 所有JAVA基础一键查阅(含习题集)-CSDN博客


🌈引出

这篇文章我们详细讲解如何创建两个并发执行的线程。


🌈创建两个并发线程

还是以常见的转账为例子:

🔥task1&&task2

记住这个例子!!

import java.util.Arrays;

public class Concurrent {
    public static final int DELAY = 10;
    public static final int STEPS = 100;
    public static final double MAX_AMOUNT = 1000;

    public static void main(String[] args) {
        Bank bank = new Bank(4, 10000);

        Runnable task1 = () -> {
            try {
                for (int i = 0; i < STEPS; i++) {
                    double amount = MAX_AMOUNT * Math.random();
                    bank.transfer(0, 1, amount);
                    Thread.sleep((int) (DELAY * Math.random()));
                }

            } catch (InterruptedException e) {
            }
        };

        Runnable task2 = () -> {
            try {
                for (int i = 0; i < STEPS; i++) {
                    double amount = MAX_AMOUNT * Math.random();
                    bank.transfer(2, 3, amount);
                    Thread.sleep((int) (DELAY * Math.random()));
                }

            } catch (InterruptedException e) {
            }
        };
        new Thread(task1).start();
        new Thread(task2).start();
    }
}

🔥Bank类:

class Bank{

    private final double[] accounts;

    Bank(int n,double initialBalance) {
        this.accounts = new double[n];
        Arrays.fill(accounts,initialBalance);
    }

    public void transfer(int from,int to,double amount){
        if(accounts[from]< amount)return;
        System.out.print("线程信息:"+Thread.currentThread());
        System.out.print("\t线程I D:"+ Thread.currentThread().getId());
        accounts[from]-= amount;
        System.out.printf(" %10.2f from %d to %d",amount,from,to);
        accounts[to]+= amount;System.out.printf(" Total Balance:%10.2f%n",getTotalBalance());
    }

    private double getTotalBalance() {
        double sum=0;
        for (double account : accounts) {
            sum+=account;
        }
        return sum;
    }
    private int size(){
        return accounts.length;
    }
}

🔥执行结果:

注意这里的Thread[Thread-1,5,main]表示这是一个线程,线程名为Thread-1,ID为-1,优先级为5(默认),“main”通常表示该线程所属的线程组,这里表示是主线程组。

线程唯一标识为ID13。


🌈详细解释上面程序


🌈在一个单独的线程中运行一个简单的任务:

🌈三大步:

在Runnable里面定义任务、以Runnable为参数构建线程对象、启动线程

定义任务、构建对象、启动线程。


1.在Runnable里面定义了将来用此run启动的线程将要执行的任务。

Runnable r=()->{ task code };

将执行这个任务的代码放在一个类的run方法中,这个类要实现Runnable接口。Runnable接口非常简单,只有一个方法:

public interface Runnable
void run();
}


由于Runnable是一个函数式接口,可以用一个lambda 表达式创建一个实例:
 

Runnable r=()->{ task code };

2.以这个实现了 Runnable接口的变量为参数,构造一个 Thread 对象:
 

var t= new Thread(r);

🔥3.启动线程

t.start();


为了建立单独的线程来完成转账,我们只需要把转账代码放在一个Runnable的run方法中,然后启动一个线程:

🌈今日总结 

🌈定义线程并执行就三大步:

在Runnable里面定义任务、以Runnable为参数构建线程对象、启动线程

定义任务、构建对象、启动线程。

 🔥记住这个线程实体就行

public class Concurrent {

public static void main(String[] args) {
Runnable r=()->{
    try{
        for(int i=0;i<STEPS; i++)
        double amount = MAX AMOUNT * Math.random();
        bank.transfer(0,1,amount);
        Thread.sleep((int)(DELAY * Math.random()));
    }catch (InterruptedException e)
    {
    }
    
};//Runnable方法结束,这是将来的线程里面的任务实体类,定义结束了

//定义线程,并将含有的待执行任务的实现了Runnable接口的变量r作为变量,放入其中
    var t= new Thread(r);

//启动线程
    t.start();
    }
}



💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖

热门专栏推荐

🌈🌈计算机科学入门系列                     关注走一波💕💕

🌈🌈CSAPP深入理解计算机原理        关注走一波💕💕

🌈🌈微服务项目之黑马头条                 关注走一波💕💕

🌈🌈redis深度项目之黑马点评            关注走一波💕💕

🌈🌈JAVA面试八股文系列专栏           关注走一波💕💕

🌈🌈JAVA基础试题集精讲                  关注走一波💕💕   

🌈🌈代码随想录精讲200题                  关注走一波💕💕


总栏

🌈🌈JAVA基础要夯牢                         关注走一波💕💕  

🌈🌈​​​​​​JAVA后端技术栈                          关注走一波💕💕  

🌈🌈JAVA面试八股文​​​​​​                          关注走一波💕💕  

🌈🌈JAVA项目(含源码深度剖析)    关注走一波💕💕  

🌈🌈计算机四件套                               关注走一波💕💕  

🌈🌈数据结构与算法                           ​关注走一波💕💕  

🌈🌈必知必会工具集                           关注走一波💕💕

🌈🌈书籍网课笔记汇总                       关注走一波💕💕         



📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值