🌈hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。
✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!
🔥个人主页:Ethan Yankang
🔥推荐:史上最强八股文||一分钟看完我的几百篇博客
🔥温馨提示:划到文末发现专栏彩蛋 点击这里直接传送
🔥本篇概览:详细讲解了如何构建两个并发线程并执行指定任务。以此引出了线程的构建三大步。🌈⭕🔥
【计算机领域一切迷惑的源头都是基本概念的模糊,算法除外】
目录
1.在Runnable里面定义了将来用此run启动的线程将要执行的任务。
2.以这个实现了 Runnable接口的变量为参数,构造一个 Thread 对象:
🌈序言:
JAVA基础必序扎实的一批,此关不过,啥都没有。今日得《JAVA核心技术·卷I》之良品辅助,应按本书学之习之,时时复习,长此以往必能穿魂入脉,习得大功。
感谢Cay S. Horstmann给世界留下如此优美的作品。
对于一个强烈想完全掌握JAVA的技术宅来说,JAVA的XXX万万不能放过,这些基础的概念例程都值得细细体味的,千万别觉得都是文字,浪费时间,记住——别违背科学发展的客观规律。别一味地赶进度以满足自己学的都么快的虚荣心,自欺欺人,要老老实实的走好每一步。
上一篇文章详细讲解了XX,建议先将这部分知识掌握之后再来学习本篇内容,点击查看。
🔥《JAVA核心技术卷·I》——第十二章1——什么是线程?舞台剧(最优美的比喻)——《并发》-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!!!
📚愿大家都能学有所得,功不唐捐!