package test2; public class MainService { private static MainService instance = new MainService(); public static MainService getInstance() { return instance; } @SuppressWarnings("static-access") public void fun(String parm) { synchronized (parm) { for (int i = 1; i < 4; i++) { StringBuffer buf = new StringBuffer(); buf.append("当前对象:").append(this).append("\t\t"); buf.append("当前线程:").append(Thread.currentThread().getName()) .append("\t\t"); buf.append("当前i值:").append(i); System.out.println(buf.toString()); try { Thread.currentThread().sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
package test2; public class TestThread { public static final String str01 = "1"; public static final String str02 = "2"; public static void test01() { new Thread(new Runnable() { @Override public void run() { MainService.getInstance().fun(str01); } }).start(); new Thread(new Runnable() { @Override public void run() { MainService.getInstance().fun(str02); } }).start(); } public static void test02() { new Thread(new Runnable() { @Override public void run() { MainService.getInstance().fun(str01); } }).start(); new Thread(new Runnable() { @Override public void run() { MainService.getInstance().fun(str01); } }).start(); } public static void test03() { new Thread(new Runnable() { @Override public void run() { new MainService().fun(str01); } }).start(); new Thread(new Runnable() { @Override public void run() { new MainService().fun(str02); } }).start(); } public static void test04() { new Thread(new Runnable() { @Override public void run() { new MainService().fun(str01); } }).start(); new Thread(new Runnable() { @Override public void run() { new MainService().fun(str01); } }).start(); } public static void main(String[] args) { // test01(); // 当前对象:test.MainService@24c21495 当前线程:Thread-0 当前i值:1 // 当前对象:test.MainService@24c21495 当前线程:Thread-1 当前i值:1 // 当前对象:test.MainService@24c21495 当前线程:Thread-1 当前i值:2 // 当前对象:test.MainService@24c21495 当前线程:Thread-0 当前i值:2 // 当前对象:test.MainService@24c21495 当前线程:Thread-1 当前i值:3 // 当前对象:test.MainService@24c21495 当前线程:Thread-0 当前i值:3 // test02(); // 当前对象:test.MainService@41d5550d 当前线程:Thread-0 当前i值:1 // 当前对象:test.MainService@41d5550d 当前线程:Thread-0 当前i值:2 // 当前对象:test.MainService@41d5550d 当前线程:Thread-0 当前i值:3 // 当前对象:test.MainService@41d5550d 当前线程:Thread-1 当前i值:1 // 当前对象:test.MainService@41d5550d 当前线程:Thread-1 当前i值:2 // 当前对象:test.MainService@41d5550d 当前线程:Thread-1 当前i值:3 // test03(); // 当前对象:test2.MainService@24c21495 当前线程:Thread-0 当前i值:1 // 当前对象:test2.MainService@41d5550d 当前线程:Thread-1 当前i值:1 // 当前对象:test2.MainService@24c21495 当前线程:Thread-0 当前i值:2 // 当前对象:test2.MainService@41d5550d 当前线程:Thread-1 当前i值:2 // 当前对象:test2.MainService@41d5550d 当前线程:Thread-1 当前i值:3 // 当前对象:test2.MainService@24c21495 当前线程:Thread-0 当前i值:3 // test04(); // 当前对象:test2.MainService@24c21495 当前线程:Thread-0 当前i值:1 // 当前对象:test2.MainService@24c21495 当前线程:Thread-0 当前i值:2 // 当前对象:test2.MainService@24c21495 当前线程:Thread-0 当前i值:3 // 当前对象:test2.MainService@41d5550d 当前线程:Thread-1 当前i值:1 // 当前对象:test2.MainService@41d5550d 当前线程:Thread-1 当前i值:2 // 当前对象:test2.MainService@41d5550d 当前线程:Thread-1 当前i值:3 } }
同一对象,参数不同,方法不互斥
同一对象,参数相同,方法互斥
不同对象,参数不同,方法不互斥
不同对象,参数相同,方法互斥
相关推荐
二、多线程的作用 1. 提高程序响应性:当一个线程在等待I/O操作(如网络通信或磁盘读写)时,其他线程可以继续执行,避免了程序的阻塞。 2. 资源利用率:多线程可以充分利用多核处理器,使得计算任务并行执行,提高...
Python里的多线程是假的多线程,不管有多少核,同一时间只能在一个核中进行操作!利用Python的多线程,只是利用CPU上下文切换的优势,看上去像是并发,其实只是个单线程,所以说他是假的单线程。 那么什么时候用多...
本教程将帮助初学者理解C#中的多线程概念,并通过一个Windows Forms应用程序实例,演示如何在WinForm控件中启动、暂停、继续子线程以及输出数据。 首先,我们来看多线程的基本概念。在单线程程序中,所有的任务按...
为了解决这个问题,开发者通常会借助C#语言的多线程技术来提升效率。本文将深入探讨如何在Revit中实现C#的多线程处理,并通过实例和源代码来阐述这一过程。 首先,我们需要理解Revit的API限制。Revit不允许在非主线...
在编程领域,多线程是实现并发执行任务的重要机制,特别是在易语言中,它能有效提升程序的执行效率。...对于易语言的学习者来说,研究这个源码将是一个宝贵的实践机会,可以加深对多线程编程的理解。
通过学习和实践上述知识点,你将能够深入理解多线程编程,并能有效利用这一技术提高程序的性能和响应性。如果你下载了"多线程.rar"这个压缩包,其中很可能包含了示例代码和教程,这将是你学习多线程的宝贵资源。
总结起来,无论是C语言还是Java,实现多线程都需要理解线程的创建、调度、同步和通信。通过合理利用线程,开发者可以编写出更高效、响应更快的应用程序,充分利用现代计算机的多核优势。在实际开发中,应根据需求...
通过学习和实践这个项目,你可以深入理解多线程的基本原理,以及如何将它们应用到实际的聊天室程序中。同时,也可以在此基础上进一步扩展功能,例如实现更复杂的用户认证、消息加密、文件传输等特性,提升你的编程...
理解多线程的基本原理和实践方法,有助于开发者在各种场景下实现更高效的自动化解决方案。 在压缩包文件“多线程.Q”中,很可能包含了一个或多个人工编写的具体多线程按键精灵脚本示例,可能包括线程的创建、线程间...
"有例子"意味着提供了示例代码,帮助用户理解如何使用这个多线程控件。"虽不太完善"暗示这个控件可能存在一些未解决的问题或者未完善的特性,但仍然可以有效地实现多线程操作。"而不是PB本身所实现的共享机制"指的是...
首先,我们需要理解多线程中的一些核心概念: 1. **线程**:线程是操作系统分配CPU时间的基本单位,每个线程都有自己的执行路径,它们可以并行或交替执行。 2. **共享资源**:在多线程环境中,多个线程可能需要...
Linux 下 C 语言多线程编程实例 Linux 下的多线程编程是一种非常重要的技术,在...本实例提供了一个非常实用的多线程编程示例,帮助我们更好地理解多线程编程的基本概念和技术,并且可以作为实际应用的参考和借鉴。
首先,我们需要理解多线程的基本概念。在计算机科学中,线程是程序执行的最小单元,每个线程都有自己的程序计数器、系统栈、局部变量和状态。多线程允许一个应用程序同时执行多个不同的任务,这在处理大量数据、实现...
《深入理解易语言版多线程通用框架》 在计算机编程中,多线程是一种并发执行任务的技术,它允许多个任务在同一时间内运行,从而提高了系统资源的利用率和程序的响应速度。尤其在易语言这样的高级编程环境中,多线程...
二、PB12.5的多线程支持 PB12.5引入了对多线程的更好支持,它引入了一个名为“Worker Thread”的新概念。开发者可以创建一个工作线程对象,然后在这个对象上执行自定义的代码块。这使得在PB应用中实现多线程变得更加...
在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以充分利用现代多核处理器的优势,实现并行处理和高效能编程...通过分析和运行这些实例,开发者可以深入理解多线程在实际项目中的运用,提升解决问题的能力。
以下是对Java多线程的深入理解: 线程概述 基本概念:线程是操作系统能够进行运算调度的最小单位,一个进程可以包含多个线程。 特性:线程不拥有系统资源,只拥有一点必不可少的、能保证独立运行的资源。同一进程...
易语言是一种专为中国人设计的编程语言,它以简明的中文语法,降低了编程的门槛,使得更多非专业背景的用户也能快速上手编程。...通过研究这些内容,可以深入理解易语言的线程机制,并掌握如何在实践中应用多线程技术。
《Java多线程编程(第二版)》这本书深入探讨了这一主题,旨在帮助开发者更好地理解和应用Java的并发特性。 在Java中,多线程允许程序同时执行多个任务,提高应用程序的效率和响应性。核心概念包括线程的创建、同步...
因此,现代应用程序开发人员必须深入理解多线程。 本书是一本通俗易懂的C#多线程编程指南,通过70多个容易理解的示例,循序渐进地讲解C#5.0中的异步及并发编程,引导读者了解Windows下C#多线程编程的多样性。 通过...