`

我写的一个多线程的例子,但打印线程不能退出,各位达人帮我看看。

    博客分类:
  • java
阅读更多
谁帮我看看,PrintOperation怎么结束呀? 或者是我的线程同步有问题?
public class Counter {
	private int value;
	
	private boolean isWritable = true;
	
	public void add(){
		value++;
	}
	
	public void print(){
		System.out.println(value);
	}

	public boolean isWritable() {
		return isWritable;
	}

	public void setWritable(boolean isWritable) {
		this.isWritable = isWritable;
	}
}


public class AddOperation implements Runnable {
	private Counter counter;

	private final int size;

	public AddOperation(Counter counter, int size) {
		this.counter = counter;
		this.size = size;
	}

	@Override
	public void run() {
		try {
			for (int i = 0; i < size; i++) {
				synchronized (counter) {
					if (!counter.isWritable()) {
						counter.wait();
					}
					counter.add();
					counter.setWritable(false);
					counter.notify();
				}
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}


public class PrintOperation implements Runnable{
	private Counter counter;
	
	private boolean canRun = true;
	
	public PrintOperation(Counter counter) {
		this.counter = counter;
	}
	
	@Override
	public void run() {
		while(canRun){
			synchronized(counter){
				if(counter.isWritable()){
					try {
						counter.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				counter.print();
				counter.setWritable(true);
				counter.notify();
			}
		}
	}
	
	public void stopThread(){
		synchronized(counter){
			this.canRun = false;
			counter.notify();
		}
	}
}

public class MultiThreadTest {   
	public final static int SIZE = 5;
       
    public static void main(String[] args) {
		Counter counter = new Counter();
		
		AddOperation addOperation = new AddOperation(counter,SIZE);
		PrintOperation printOperation = new PrintOperation(counter);
		
		Thread addThread = new Thread(addOperation);
		Thread printThread = new Thread(printOperation);
		
		addThread.start();
		printThread.start();
		
	}
}


分享到:
评论

相关推荐

    今天没事给大家写一个多线程例子

    今天没事给大家写一个多线程例子 今天没事给大家写一个多线程例子

    易语言多线程简单实用例子分享

    在这个“易语言多线程简单实用例子分享”中,我们将探讨如何在易语言中利用多线程技术来提高程序的运行效率和用户体验。 多线程是现代软件开发中的一个重要概念,它允许程序同时执行多个任务,而不是顺序地执行。在...

    鱼刺多线程注册源码例子(鱼刺多线程稳定框架)

    "鱼刺多线程注册源码例子"是一个基于"鱼刺多线程稳定框架"的编程实践,旨在展示如何在软件开发中有效地利用多线程技术来提高程序的执行效率和稳定性。在这个例子中,"鱼刺框架"可能是一个专门为多线程编程设计的开源...

    5个qt多线程例子

    第一个例子“调试---1.tar.gz”可能是一个用于调试多线程应用程序的工具,帮助开发者跟踪线程间的交互和同步问题。调试多线程程序是一项挑战,因为它涉及到线程间的复杂关系和同步原语,如信号和槽、mutexes、...

    c++多线程编程的十个例子

    一个例子可能是两个线程共享一个资源,一个线程读取,另一个线程写入,互斥量确保同一时间只有一个线程能访问资源。 3. **线程 join** 当主线程需要等待其他线程完成其工作时,可以使用`join()`函数。例如,主线程...

    java多线程例子

    在第一个例子中,我们将继承 Thread 类来创建一个多线程类 TestThread。 ```java public class ThreadDemo { public static void main(String[] args) { new TestThread().start(); while(true) { System.out....

    Delphi API 串口通信 多线程例子.rar

    在"Delphi API 串口通信 多线程例子.rar"这个压缩包中,可能包含了一个示例项目,展示了如何使用Delphi的API和多线程技术实现串口通信。文件名"codefans.net"可能指的是一个代码分享网站,或者是一个特定的源代码...

    C语言使用多线程例子

    在这个“C语言使用多线程例子”中,我们将探讨如何使用Windows API中的`CreateThread`函数来创建线程。 首先,`CreateThread`函数是Windows操作系统提供的一种API调用,用于在进程中创建新的执行线程。它的基本语法...

    vb.net多线程例子

    总的来说,VB.NET的多线程功能强大且易于使用,对于初学者来说,通过简单的例子学习多线程是一个很好的起点。不过,随着项目复杂性的增加,理解并掌握线程管理、同步和通信机制至关重要,这将有助于编写出更加健壮和...

    易语言多线程操作例子

    一个易语言操作多线程的例子,分享一下,对于多线程操作,我还是觉得C++更好一点!

    MFC多线程例子

    MFC多线程是MFC库中的一个重要特性,允许开发者在同一个应用程序中创建和管理多个执行线程,从而实现并发处理任务,提高程序效率。在Windows操作系统中,多线程技术广泛应用于UI更新、后台数据处理、异步操作等场景...

    udp多线程例子

    【描述】中反复提到“网上下的Linux下udp多线程的一个例子”,这意味着提供的压缩包可能包含了一个示例代码,展示了如何在Linux系统中实现UDP的多线程应用。这个例子可能包括客户端和服务器两部分,服务器使用多线程...

    Delphi中最简单的多线程例子

    本篇文章将详细讲解一个在Delphi中实现的最简单的多线程例子,帮助你理解如何在实践中应用多线程。 首先,让我们分析一下提供的文件列表: 1. `ThSort.dcu` 和 `SortThds.dcu`:这些是编译后的单元文件,包含了源...

    一个C++多线程例子

    多线程例子.cpp,有兴趣的可以下来研究一下.....

    用MFC写的简单多线程下载例子

    在这个“用MFC写的简单多线程下载例子”中,我们将探讨如何利用MFC实现多线程下载功能。 首先,理解多线程的基本概念至关重要。在单线程应用中,任务执行按顺序进行,而多线程则允许同时执行多个任务。在下载场景中...

    多线程编程安全退出

    多线程编程安全退出需要设计一定的算法来让线程自己主动地退出,而不能简单地使用线程退出函数来强制某个线程的退出。通过使用读写锁和计数器,可以实现多线程的安全退出,避免程序异常的出现。

    winform_c#_多线程例子

    本项目"winform_c#_多线程例子"显然是一个演示如何在Winform应用中正确使用多线程的示例。 多线程允许应用程序同时执行多个不同的任务,提高程序的并发性和效率。在Winform中,主线程主要负责用户界面的交互,而...

    C#多线程读写sqlite

    通过多线程,程序可以同时执行多个任务,但这也可能导致数据冲突。 2. **SQLite数据库**:SQLite是一个自包含、无服务器、零配置、事务性的SQL数据库引擎,它允许开发者在.NET应用中嵌入数据库,无需安装额外的...

    一个初步的用VB写“多线程”程序的例子(9KB)

    标题中的“一个初步的用VB写“多线程”程序的例子”表明这是一个关于使用Visual Basic (VB)编程语言实现多线程技术的示例项目。多线程是计算机编程中的一个重要概念,允许程序同时执行多个任务,从而提高效率和响应...

    C++多线程例子

    在C++编程中,多线程是一个核心概念,它允许程序同时执行多个任务,从而提高效率和性能。尤其是在处理大量并发操作或者需要充分利用现代多核处理器能力时,多线程显得尤为重要。本教程将深入探讨C++中的多线程编程,...

Global site tag (gtag.js) - Google Analytics