每个线程或者实现Runnable接口再传递给Tread构造,或者直接继承Thread类
前者的优势在于,还可以继承其他的类
Thread.sleep让当前线程休眠一段时间,让步给其他线程或程序
指定的这个时间通常不太精确,另外会被interrupt()中断休眠
中断是说这个线程立即终止目前的工作,但要想正确使用,事先要保证这个线程会抛出中断异常
for (int i = 0; i < importantInfo.length; i++) { // Pause for 4 seconds try { Thread.sleep(4000);//调用的这个方法可以被中断,中断后立即返回 } catch (InterruptedException e) { // We've been interrupted: no more messages. return; } // Print a message System.out.println(importantInfo[i]); }
if (Thread.interrupted()) {//调用这个方法能查询是否被中断了,同时也清除中断状态 throw new InterruptedException();//或者手动抛出然后捕获 }
isInterrupted不会清除中断状态
但任何线程一旦跑出了中断异常,自动解除中断状态
t.join();会让当前线程暂停,等待t线程结束后再恢复,如果t现在正在运行的话
public static void main(String args[]) throws InterruptedException { // Delay, in milliseconds before // we interrupt MessageLoop // thread (default one hour). long patience = 1000 * 60 * 60;//等待的最长时间 // If command line argument // present, gives patience // in seconds. if (args.length > 0) { try { patience = Long.parseLong(args[0]) * 1000; } catch (NumberFormatException e) { System.err.println("Argument must be an integer."); System.exit(1); } } threadMessage("Starting MessageLoop thread"); long startTime = System.currentTimeMillis(); Thread t = new Thread(new MessageLoop()); t.start(); threadMessage("Waiting for MessageLoop thread to finish"); // loop until MessageLoop // thread exits while (t.isAlive()) { threadMessage("Still waiting..."); // Wait maximum of 1 second // for MessageLoop thread // to finish. t.join(1000); if (((System.currentTimeMillis() - startTime) > patience) && t.isAlive()) { threadMessage("Tired of waiting!");//超过之后 t.interrupt();//强制中断 // Shouldn't be long now // -- wait indefinitely t.join(); } } threadMessage("Finally!"); } }
线程间通常通过共享字段来交流,但经常性发生问题,thread interference和memory consistency errors
happens-before关系能够保证某个语句写后的内容在另一个语句读之前就已发生:
1.同一个线程,前一个语句总是在后一个语句之前执行
2.调用另一个线程的Thread.start时,所有之前的语句都会在新线程之前执行
3.一个线程终止时由于另一个线程调用了Thread.join,则任何改变都对另一个线程可见
4.声明为volatile的字段,写总是在读之前
5.同步机制synchronization
一个对象上的同步方法不会被多次调用,而且一次调用的结果总是对下次调用可见
不能对构造方法声明同步,所以构造中如果调用了某个方法,小心多线程错误
声明为final的字段无需用同步方法访问,因为构造后是无法修改的
public static void main(String[] args) throws InterruptedException { for (int i = 0; i < 10; i++) { System.out.print(i + ","); } System.out.println(); new Thread(new Runnable() { public void run() { for (int i = 11; i < 20; i++) { System.out.print(i + ","); } } }).start(); }
这个输出结果只会是:
0,1,2,3,4,5,6,7,8,9,
11,12,13,14,15,16,17,18,19,
相关推荐
编写 parallel_for 循环需要使用 concurrency::parallel_for 算法,该算法可以将循环体中的任务分配给多个线程来执行。下面是一个简单的示例: ```cpp void parallel_matrix_multiply(double m1, double m2, double ...
1. **原子操作(Atomic Operations)**:在x86_64架构中,CPU提供了原子操作指令如CMPXCHG(比较并交换),这些指令可以在不引发数据竞争的情况下更新内存位置的值。优化可能利用这些原语来减少锁的开销。 2. **...
1. **并行for循环**:PPL中的`parallel_for`函数允许开发者编写类似于传统for循环的代码,但会在多个线程之间自动分割工作负载。这使得开发者无需关心线程创建和同步的细节,只需要关注并行化的基本逻辑即可。 2. *...
他妈的Java并发 :backhand_index_pointing_right:通过Demo演示出Java中并发问题。 :red_apple:整理Demo的原因 可以观察到的实际现象 :see-no-evil_monkey:比说说的并发原则 :speak-no-evil_monkey:更直观更可信。...
1. std::thread类 std::thread是C++11标准库提供的一个用于创建和控制线程的类。它允许我们创建一个线程,将一个可调用对象和参数传递给它,并控制线程的运行。 - 创建线程:通过传递一个可调用对象(如函数、...
《C++ Concurrency in Action》是一本深入探讨C++并发编程的权威著作,作者是Anthony Williams。这本书通过详细的实例和源代码,引导读者理解和掌握在C++中进行并发编程的关键概念和技术。源码文件列表中提到的文件...
我使用简单的基于Promise的API与Web Workers和其他Windows进行通信 使用post-me ,父母(例如主应用程序)和孩子(例如工作人员或iframe)可以很容易地将方法和自定义事件彼此公开。产品特点 :repeat_button: 父母和...
并行哈希图 概述 该存储库旨在提供一组出色的哈希映射实现,以及std :: map和std :: set的btree替代品,具有以下特征: 仅标头:无需构建,只需将parallel_hashmap目录复制到您的项目中就可以了。...
和谐使用DP按照惯用的语音引导程序生成四部分和声! >> > voiceProgression ( 'B-' , 'I I6 IV V43/ii ii V V7 I' ) 请参见的Web界面。 这是用。...WEB_CONCURRENCY= < NUM> gunicorn app执照根据。
数据库系统课件:ch15-16 Transactions & Concurrency Control.ppt
【标题】"08_mt_l2s_concurrency" 指的是一个关于“LINQ to SQL”的视频教程,重点可能是讲解在多线程环境下的并发控制。LINQ(Language Integrated Query,语言集成查询)是.NET Framework中的一项技术,它允许...
1. **线程基础**:介绍如何创建和管理线程,理解线程的状态和生命周期,以及线程之间的通信机制。 2. **同步原语**:详述std::mutex、std::lock_guard、std::unique_lock等同步工具的使用,防止数据竞争和死锁。 3...
首先,"Java Concurrency in Practice"是Java并发编程的经典之作,由Brian Goetz、Tim Peierls、Joshua Bloch、David Holmes和Doug Lea合著。这本书提供了一套实用的指导原则、设计模式和最佳实践,帮助Java开发者...
1. **任务创建与启动** 使用`concurrency::create_task`函数来创建一个新的任务。这个函数接受一个可调用对象(如函数、函数指针、lambda表达式等),并返回一个`concurrency::task`对象。一旦创建了任务,就可以...
1. **任务(Task)**:PPL 中的任务是并行执行的基本单元。开发者可以创建任务来执行特定的工作,并且这些任务可以在不同的线程或处理器上并发运行。PPL 提供了 `concurrency::task` 类,允许开发者创建、调度和等待...
通过使用`concurrency::task`,我们可以编写非阻塞的代码,使得服务器能够同时处理多个客户端连接。 此外,C++ REST SDK的`json`模块提供了方便的接口,用于JSON数据的序列化和反序列化。这对于与RESTful API交互...
《C++ Concurrency in Action》是一本深入探讨C++并发编程的专业书籍,旨在帮助开发者理解和掌握多线程、异步编程以及同步机制等关键概念。这本书提供了中英文两个版本,以便不同语言背景的读者理解,并且附带了源...
1. **读写分离**:将读取操作和写入操作分开处理,使大多数线程可以并行执行读取。 2. **自旋锁**:在读写冲突较少时,使用自旋锁代替传统互斥锁,减少线程阻塞的时间。 3. **精细粒度的锁**:对资源进行细分,只...
其中,乐观并发控制(Optimistic Concurrency Control, OCC)是一种不同于传统的基于锁的并发控制机制的方法。 #### 乐观并发控制简介 乐观并发控制作为一种对传统两阶段锁定(2PL)方法的反应而出现。两阶段锁定...
1. **输入/输出流(I/O Stream)**:C++标准库中的`iostream`模块定义了用于处理输入和输出的基本类,如`std::cin`、`std::cout`、`std::cerr`和`std::clog`。它们分别对应于标准输入、输出、错误和诊断流。通过这些...