java 线程安全 计数,Java线程安全的计数器

正在运行是线程Thread-4:988

正在运行是线程Thread-4:989

正在运行是线程Thread-4:990

正在运行是线程Thread-4:991

正在运行是线程Thread-4:992

正在运行是线程Thread-4:993

正在运行是线程Thread-4:994

正在运行是线程Thread-4:995

正在运行是线程Thread-4:996

正在运行是线程Thread-4:997

正在运行是线程Thread-4:998

正在运行是线程Thread-4:999

正在运行是线程Thread-4:1000

正在运行是线程Thread-2:399

正在运行是线程Thread-1:398

正在运行是线程Thread-0:700

正在运行是线程Thread-3:402

=====================================我是更新线=====================================

在此处补充一下JAVA多线程实现的两种方式

第一种:继承Thread类

packagecom.yolanda.fun.thread;

publicclassMyThreadextendsThread {

publicvoidrun() {

for(inti =0; i <10; i++) {

System.out.println("线程"+ Thread.currentThread().getName() +"在运行");

}

}

publicstaticvoidmain(String[] args) {

MyThread thread = newMyThread();

thread.start();

for(inti =0; i <10; i++) {

System.out.println("线程"+ Thread.currentThread().getName() +"在运行");// 线程main

}

}

}

结果:

线程main在运行

线程Thread-0在运行

线程main在运行

线程main在运行

线程Thread-0在运行

线程Thread-0在运行

线程main在运行

线程Thread-0在运行

线程main在运行

线程Thread-0在运行

线程Thread-0在运行

线程Thread-0在运行

线程Thread-0在运行

线程Thread-0在运行

线程Thread-0在运行

线程main在运行

线程main在运行

线程main在运行

线程main在运行

线程main在运行

结果分析:这里可以看到main线程和Thread-0线程交替运行。

所谓的多线程,指的是两个线程的代码可以同时运行,而不必一个线程需要等待另一个线程内的代码执行完才可以运行。对于单核CPU来说,是无法做到真正的多线程的,每个时间点上,CPU都会执行特定的代码,由于CPU执行代码时间很快,所以两个线程的代码交替执行看起来像是同时执行的一样。那具体执行某段代码多少时间,就和分时机制系统有关了。分时系统把CPU时间划分为多个时间片,操作系统以时间片为单位片为单位各个线程的代码,越好的CPU分出的时间片越小。所以看不到明显效果也很正常,一个线程打印5句话本来就很快,可能在分出的时间片内就执行完成了。所以,最简单的解决办法就是把for循环的值调大一点就可以了(也可以在for循环里加Thread.sleep方法)。

第二种:实现Runnable接口。和继承自Thread类差不多,不过实现Runnable后,还是要通过一个Thread来启动

packagecom.yolanda.fun.thread;

publicclassMyRunnableimplementsRunnable{

publicvoidrun() {

for(inti =0; i <10; i++) {

System.out.println("线程"+ Thread.currentThread().getName() +"在运行");

}

}

publicstaticvoidmain(String[] args) {

MyRunnable thread = newMyRunnable();

Thread t = newThread(thread);

t.start();

for(inti =0; i <10; i++) {

System.out.println("线程"+ Thread.currentThread().getName() +"在运行");

}

}

}

结果:

线程main在运行

线程Thread-0在运行

线程main在运行

线程Thread-0在运行

线程main在运行

线程Thread-0在运行

线程main在运行

线程main在运行

线程main在运行

线程main在运行

线程main在运行

线程main在运行

线程main在运行

线程Thread-0在运行

线程Thread-0在运行

线程Thread-0在运行

线程Thread-0在运行

线程Thread-0在运行

线程Thread-0在运行

线程Thread-0在运行

两个线程也是交替运行。

其实Thread类也是实现的Runnable接口。

8ba24350b562acf68f6fcbaa7111ec2e.png

两种实现方式对比的关键就在于extends和implements的对比,当然是后者好。因为第一,继承只能但继承,实现可以多实现;第二,实现的方式对比继承的方式,也有利于减小程序之间的耦合。

因此,多线程的实现几乎都是使用的Runnable接口的方式。

线程状态

虚拟机中的线程状态有六种,定义在Thread.State中: 1、新建状态NEW new了但是没有启动的线程的状态。比如"Thread t = new Thread()",t就是一个处于NEW状态的线程 2、可运行状态RUNNABLE new出来线程,调用start()方法即处于RUNNABLE状态了。处于RUNNABLE状态的线程可能正在Java虚拟机中运行,也可能正在等待处理器的资源,因为一个线程必须获得CPU的资源后,才可以运行其run()方法中的内容,否则排队等待 3、阻塞BLOCKED 如果某一线程正在等待监视器锁,以便进入一个同步的块/方法,那么这个线程的状态就是阻塞BLOCKED 4、等待WAITING 某一线程因为调用不带超时的Object的wait()方法、不带超时的Thread的join()方法、LockSupport的park()方法,就会处于等待WAITING状态 5、超时等待TIMED_WAITING 某一线程因为调用带有指定正等待时间的Object的wait()方法、Thread的join()方法、Thread的sleep()方法、LockSupport的parkNanos()方法、LockSupport的parkUntil()方法,就会处于超时等待TIMED_WAITING状态 6、终止状态TERMINATED 线程调用终止或者run()方法执行结束后,线程即处于终止状态。处于终止状态的线程不具备继续运行的能力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值