public class IncDecThread {
private int j=10;
/*
* 题目:用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
* 两个问题:
* 1、线程同步--synchronized
* 2、线程之间如何共享同一个j变量--内部类
*/
public static void main(String[] args) {
IncDecThread incDec=new IncDecThread();
Inc inc=incDec.new Inc();
Dec dec=incDec.new Dec();
for(int i=0;i<2;i++){
Thread thread=new Thread(inc);
thread.start();
thread=new Thread(dec);
thread.start();
}
}
public synchronized void inc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
}
public synchronized void dec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
}
class Inc implements Runnable{
public void run(){
for(int i=0;i<20;i++){
inc();
}
}
}
class Dec implements Runnable{
public void run(){
for(int i=0;i<20;i++){
dec();
}
}
}
}
第二种解法 :
package com.ljn.base;
/**
* @author lijinnan
* @date:2013-9-12 上午9:55:32
*/
public class IncDecThread2 {
/**
* 测试次数
*/
public static final int TEST_COUNT = 20;
/*
* 题目:用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
* 两个问题:
* 1、线程同步--synchronized
* 2、线程之间如何共享同一个j变量--将j以及对j的操作封装在Data类中,然后作为共享对象传递给IncRunnable和DecRunnable
*
* 相对上面第一种解法(利用内部类),本解法更符合面向对象的思想
*/
public static void main(String[] args) {
Data data = new Data();
//加1线程,2个
new Thread(new IncRunnable(data)).start();
new Thread(new IncRunnable(data)).start();
//减1线程,2个
new Thread(new DecRunnable(data)).start();
new Thread(new DecRunnable(data)).start();
}
}
class Data {
private int j = 10;
public synchronized void inc () {
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
}
public synchronized void dec () {
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
}
}
class IncRunnable implements Runnable {
private Data data;
public IncRunnable (Data data) {
this.data = data;
}
@Override
public void run() {
for (int i = 0; i < IncDecThread2.TEST_COUNT; i++) {
data.inc();
}
}
}
class DecRunnable implements Runnable {
private Data data;
public DecRunnable (Data data) {
this.data = data;
}
@Override
public void run() {
for (int i = 0; i < IncDecThread2.TEST_COUNT; i++) {
data.dec();
}
}
}
分享到:
相关推荐
多线程编程是指在一个程序中同时执行多个线程的技术。每个线程都是一个独立的执行路径,拥有自己的程序计数器、寄存器和堆栈空间。多线程编程可以提高程序的执行效率和响应速度,但也增加了程序的复杂度。 在 Java ...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提升系统效率。在多线程环境中,变量共享是一个常见的需求,但也是引发问题的关键点。本篇文章将深入探讨Java多线程下变量共享的问题以及解决...
java 多线程 加减变量
在编程领域,多线程是实现并发执行任务的重要机制,特别是在现代计算机系统中,多核处理器使得多线程成为提高程序性能的关键手段。C#语言提供了丰富的多线程支持,让我们能够编写出高效的多线程应用程序。在这个"多...
总的来说,“多线程线程变量赋值”是一个关于如何在多线程环境中管理线程私有数据的问题。通过`ThreadLocal`,我们可以创建和操作线程特有的变量,避免了数据同步的复杂性,但在使用过程中需要注意内存管理和线程...
标题"Qt 多线程访问同一个变量"涉及到的是如何在多线程环境下确保对共享资源(此处为一个全局变量)的安全访问。描述中提到了使用互斥锁来解决这个问题,并通过创建两个线程ThreadA和ThreadB来演示这一过程。 首先...
Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...
本文通过对一个简单的多线程程序的分析,介绍了如何在Windows环境中使用`CreateThread`函数创建线程,并简要探讨了生产者-消费者模式和读者写者问题。在实际开发中,还需要深入研究多线程同步机制,以确保程序的稳定...
在JAVA语言程序设计中,第十四章主要探讨的是多线程这一核心概念。多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个独立的任务,从而提高应用程序的效率和响应性。在Java中,多线程是通过实现Runnable...
本实验"java多线程之赛马程序实验8多线程练习下载进度"聚焦于如何利用多线程来模拟实际场景中的下载进度显示。在这一过程中,我们将探讨Thread类的`run`和`start`方法,以及如何通过进度条来可视化表示下载过程。 ...
### 安全编写多线程Java应用程序的关键知识点 #### 一、引言 在现代软件开发中,多线程编程已成为提升程序性能和响应性的关键手段之一。Java作为一种广泛使用的编程语言,提供了丰富的多线程支持。然而,多线程...
Java多线程程序设计是Java开发中的重要领域,它允许应用程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。在Java中,多线程主要通过两种方式实现:继承Thread类和实现Runnable接口。 一、创建线程...
通过本实验,我们学会了如何使用 Java 语言设计一个多线程的火车售票模拟程序。我们了解了多线程设计的重要性,并学习了如何使用 synchronized 关键字来实现线程同步。这个程序可以作为一个简单的示例,展示了多线程...
NULL 博文链接:https://toknowme.iteye.com/blog/2212529
总结来说,这个“java写的红绿灯演示程序”是一个理想的实践案例,它展示了Java多线程的基本使用,包括线程的创建、同步、通信和控制。通过分析这个程序,我们可以深入理解J2SE中的并发编程,这对于任何Java开发者来...
Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...
当我们使用多个线程访问同一资源(可以是同一个变量、同一个文件、同一条记录等)的时候,若多个线程只有读操作,那么不会发生线程安全问题(因为不会对数据进行修改)。但是如果多个线程中对资源有读和写的操作,就...
例如,`count += 1`这样的操作实际上包含读、加、写三个步骤,在多线程环境中,如果在这些步骤之间发生线程切换,可能会导致数据不一致。Java提供了synchronized和java.util.concurrent包下的原子类(如...
在Java编程中,多线程同步是一个常见的挑战,特别是在需要线程按照特定顺序执行任务时。本主题聚焦于如何使用Java实现10个线程按照顺序打印数字1到100。这种问题通常通过线程间通信和同步机制来解决,如`...