设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1.
来源:互联网 发布:软件测评中心 编辑:程序博客网 时间:2024/06/10 07:48
public class Test2 {public static void main(String[] args) {Factory factory = new Factory();T1 t1 = new T1(factory);T2 t2 = new T2(factory);Thread thread1 = new Thread(t1, "加线程1");Thread thread2 = new Thread(t1, "加线程2");Thread thread3 = new Thread(t2, "减线程1");Thread thread4 = new Thread(t2, "减线程2");thread1.start();thread2.start();thread3.start();thread4.start();}}class T1 implements Runnable {Factory factory = null;T1(Factory factory) {this.factory = factory;}@Overridepublic void run() {while (true) {factory.add();try {Thread.sleep((int) Math.random() * 10);} catch (InterruptedException e) {e.printStackTrace();}}}}class T2 implements Runnable {Factory factory = null;T2(Factory factory) {this.factory = factory;}@Overridepublic void run() {while (true) {factory.min();try {Thread.sleep((int) Math.random() * 10);} catch (InterruptedException e) {e.printStackTrace();}}}}class Factory {int j;Factory() {j = 0;}synchronized void add() {j++;System.out.println(Thread.currentThread().getName()+":"+j);}synchronized void min() {j--;System.out.println(Thread.currentThread().getName()+":"+j);}}
- package com.bookshop.util;
- public class Test {
- private int j = 100;
- public static void main(String args[]) {
- Test tt = new Test();
- Inc inc = tt.new Inc();
- Dec dec = tt.new Dec();
- for (int i = 0; i < 1000; i++) {// 外层用来跑1000次
- for (int j = 0; j < 2; j++) {// 内层用来生成四个线程
- Thread t = new Thread(inc);
- t.start();
- Thread t1 = new Thread(dec);
- t1.start();
- }
- }
- }
- private synchronized void inc() {
- j++;
- System.out.println(Thread.currentThread().getName() + "-inc:" + j);
- }
- private synchronized void dec() {
- j--;
- System.out.println(Thread.currentThread().getName() + "-dec:" + j);
- }
- class Inc implements Runnable {
- public void run() {
- inc();
- }
- }
- class Dec implements Runnable {
- public void run() {
- dec();
- }
- }
- }
三个类: 加1:
- import java.util.concurrent.atomic.AtomicInteger;
- public class AddNum extends Thread {
- private AtomicInteger i;
- public AddNum(AtomicInteger i) {
- this.i = i;
- }
- @Override
- public void run() {
- synchronized (i) {
- i.getAndIncrement();
- System.out.println(i);
- }
- }
- }
减1:
- import java.util.concurrent.atomic.AtomicInteger;
- public class SubstractNum extends Thread {
- private AtomicInteger i;
- public SubstractNum(AtomicInteger i) {
- this.i = i;
- }
- @Override
- public void run() {
- synchronized (i) {
- i.decrementAndGet();
- System.out.println(i);
- }
- }
- }
测试类:
- import java.util.concurrent.atomic.AtomicInteger;
- public class TestThread {
- public static void main(String[] args) {
- AtomicInteger i = new AtomicInteger(30);
- for (int j = 0; j < 1000; j++) {
- new AddNum(i).start();
- new SubstractNum(i).start();
- }
- }
- }
三个类: 加1:
- import java.util.concurrent.atomic.AtomicInteger;
- public class AddNum extends Thread {
- private AtomicInteger i;
- public AddNum(AtomicInteger i) {
- this.i = i;
- }
- @Override
- public void run() {
- synchronized (i) {
- i.getAndIncrement();
- System.out.println(i);
- }
- }
- }
减1:
- import java.util.concurrent.atomic.AtomicInteger;
- public class SubstractNum extends Thread {
- private AtomicInteger i;
- public SubstractNum(AtomicInteger i) {
- this.i = i;
- }
- @Override
- public void run() {
- synchronized (i) {
- i.decrementAndGet();
- System.out.println(i);
- }
- }
- }
测试类:
- import java.util.concurrent.atomic.AtomicInteger;
- public class TestThread {
- public static void main(String[] args) {
- AtomicInteger i = new AtomicInteger(30);
- for (int j = 0; j < 1000; j++) {
- new AddNum(i).start();
- new SubstractNum(i).start();
- }
- }
- }
注:这里inc方法和dec方法加synchronized关键字是因为当两个线程同时操作同一个变量时,就算是简单的j++操作时,在系统底层也是通过多条机器语句来实现,所以在执行j++过程也是要耗费时间,这时就有可能在执行j++的时候,另外一个线程H就会对j进行操作,因此另外一个线程H可能操作的可能就不是最新的值了。因此要提供线程同步
0 0
- 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1.
- 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1.
- 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。
- 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1
- 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1
- 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。
- 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1
- 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。
- 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1
- 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1
- 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。
- 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。
- java面试笔试题:设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1.写出程序
- 一道java线程面试题--设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
- 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。考虑到线程的安全性写出程序。
- 设计 4 个 ( 可以是 n 个 ) 线程,其中两个线程每次对 j 增加 1 ,另外两个线程对 j 每次减少 1
- 设计 4 个 ( 可以是 n 个 ) 线程,其中两个线程每次对 j 增加 1 ,另外两个线程对 j 每次减少 1
- 123、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
- MyEclipse8.5.0版本
- python基础语法(2)
- windows环境reactjs入坑记------react开发环境安装
- 领导的艺术
- 17、Power Query-户口信息统计
- 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1.
- 一个简单的饼状图的绘制!
- python基础语法(3)
- Mac命令大全
- 类的封装和访问控制
- top命令浅析
- emoji表情在web的展示与mysql存储方式
- linux中给PHP安装mongodb的扩展
- PDO, MYSQLI的对比