千家信息网

如何使用Java的多线程来实现累加计数

发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章主要介绍了如何使用Java的多线程来实现累加计数,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。题目给定count=0;让5个线
千家信息网最后更新 2025年01月16日如何使用Java的多线程来实现累加计数

这篇文章主要介绍了如何使用Java的多线程来实现累加计数,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

题目

给定count=0;让5个线程并发累加到1000;

思路

  • 创建一个类MyRunnable,实现Runnable(继承Thread类也可)

  • 定义一个公共变量count(初始值为0),5个线程都可以访问到;

  • 创建5个线程并发递增count到1000;

注意

这块注意Thread和Runnable类的区别,Thread类是线程类,可以直接new Thread().start运行。而Runnable类是任务类,需要一个线程来承载任务,通过new Thread(new Runnable()).start()来运行任务。

方法

方法一

将count公共变量放到测试类Test的类成员变量里,将MyRunnable类作为Test类的内部类,在Test类的main方法里创建5个线程,实现累加。

代码

public class Test { //公共变量 int count=0; public static void main(String[] args){  //new一个实现Runnable的类  Test test=new Test();  //创建5个任务  MyRunnable myRunnable1=test.new MyRunnable();  MyRunnable myRunnable2=test.new MyRunnable();  MyRunnable myRunnable3=test.new MyRunnable();  MyRunnable myRunnable4=test.new MyRunnable();  MyRunnable myRunnable5=test.new MyRunnable();  //创建5个线程  new Thread(myRunnable1).start();  new Thread(myRunnable2).start();  new Thread(myRunnable3).start();  new Thread(myRunnable4).start();  new Thread(myRunnable5).start(); } //创建一个实现Runnable的类 class MyRunnable implements Runnable{  public void run() {   while(true){    //锁住的是整个MyRunnable类    synchronized(MyRunnable.class){     if(count>=1000){      break;     }     System.out.println(Thread.currentThread().getName()+":count:"+(++count));     //测试时,线程更容易切换     Thread.yield();    }       }  }   } }

方法二
以上代码没有问题,成功实现5个线程累加count到1000,接下来我们将上边代码稍作修改。

  • 将5个线程执行5个任务,修改为5个线程执行同一任务。

  • 将synchronized(MyRunnable.class)修改为synchronized(this)

代码

public class Test { //公共变量 int count=0; public static void main(String[] args){  //new一个实现Runnable的类  Test test=new Test();  //创建1个任务  MyRunnable myRunnable1=test.new MyRunnable();//  MyRunnable myRunnable2=test.new MyRunnable();//  MyRunnable myRunnable3=test.new MyRunnable();//  MyRunnable myRunnable4=test.new MyRunnable();//  MyRunnable myRunnable5=test.new MyRunnable();  //创建5个线程  for(int i=0;i<4;i++){   new Thread(myRunnable1).start();  }//  new Thread(myRunnable2).start();//  new Thread(myRunnable3).start();//  new Thread(myRunnable4).start();//  new Thread(myRunnable5).start(); } //创建一个实现Runnable的类 class MyRunnable implements Runnable{  public void run() {   while(true){    //锁住的是同一对象    synchronized(this){     if(count>=1000){      break;     }     System.out.println(Thread.currentThread().getName()+":count:"+(++count));     //测试时,线程更容易切换     Thread.yield();    }       }  }   }}

以上代码没有问题,成功实现5个线程累加count到1000。

虽然结果是一样的,但是代码实现是不一样的,代码一是创建了5个MyRunnable对象,代码二只创建了1个MyRunnable对象。考虑并发时用到的锁就是不一样的,

代码一和代码二虽然synchronized中的锁不同,但目的都是为了括号中的锁是恒定不变的。

  • synchronized(this)代表锁是this对象,代码二中之所以可以使用this,是因为几个线程使用的this都是同一个对象。

  • synchronized(MyRunnable.class)代表锁是MyRunnable.class.this,因为MyRunnable.class.this是类加载到静态方法区中,是一直存在不变的,代码一中可以使用,当然代码二也可以这样写。

  • 代码一和代码二可以使用更通用的方式就是专门new一个锁对象,这个锁对象可以放在类成员变量里,加上static就可以一直常存。如定义成public static Object lock=new Object();代码一和代码二都可以使用synchronized(lock)来加锁。synchronized(this)这种方式主要是因为书写方便。

方法三

使用AtomicInteger类,来实现多线程累加,AtomicInteger类是线程安全的,使用它的优点就是我们不需要在代码里写Synchronized关键字了,这些事都交给它去做了。

代码

public class Test {    static CountDownLatch cdl=new CountDownLatch(1000);;    static AtomicInteger ai=new AtomicInteger(0);    public static void main(String[] args) throws InterruptedException{      ExecutorService exec=Executors.newFixedThreadPool(100);       for (int i = 0; i < 1000; i++) {        exec.execute(new Runnable() {    @Override    public void run() {     System.out.println(Thread.currentThread().getName()+":"+ai.getAndIncrement());     cdl.countDown();    }   });          }     cdl.await();     System.out.println(ai.get());     exec.shutdown();    } }

代码中用到了CountDownLatch类,用法就是给其设定一个初始值1000,然后在不同线程中执行countDown方法,每执行一次,初始值-1,await方法就是等初始值减到0时,停止等待,否则一直等待。

感谢你能够认真阅读完这篇文章,希望小编分享的"如何使用Java的多线程来实现累加计数"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

线程 代码 方法 任务 变量 对象 就是 篇文章 测试 不同 成功 代表 成员 方式 问题 切换 运行 安全 恒定 接下来 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 sql数据库开机自启 瀚高数据库怎么开启外部访问 数据库中查询前几条数据 法律是不是网络安全的一道保障线 自媒体中的数据库 逻辑优先级数据库 手机桌面出现数据库 网络安全需要用的什么 广东正规软件开发如何收费 软件开发中的组件是什么意思 软件开发如何分配小组 软件开发的成本有哪些 供电 网络安全风险评估报告 王者没有推荐的服务器怎么办 服务器需要用户名和密码吗 juki数据库怎么打开 网络安全当下热门行业 临沂天宇网络技术有限公司 南京滨江基地服务器搬迁 服务器锁死 网络安全应急响应 黑掉全校数据库表白 二级网络安全管理员 网络技术考研的专业有哪些 软件开发公司的经营风险 买备案域名解析服务器 爱客宝网络技术有限公司法人 数据库刀片服务器 计算机网络技术是学啥子 ipad优酷服务器异常 幼儿园网络安全宣传情况
0