`

Trail: Essential Classes_Lesson: Concurrency1

 
阅读更多

每个线程或者实现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 interferencememory 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 循环.doc

    编写 parallel_for 循环需要使用 concurrency::parallel_for 算法,该算法可以将循环体中的任务分配给多个线程来执行。下面是一个简单的示例: ```cpp void parallel_matrix_multiply(double m1, double m2, double ...

    我们使std :: shared_mutex快10倍

    1. **原子操作(Atomic Operations)**:在x86_64架构中,CPU提供了原子操作指令如CMPXCHG(比较并交换),这些指令可以在不引发数据竞争的情况下更新内存位置的值。优化可能利用这些原语来减少锁的开销。 2. **...

    main_ppl_concurrency_

    1. **并行for循环**:PPL中的`parallel_for`函数允许开发者编写类似于传统for循环的代码,但会在多个线程之间自动分割工作负载。这使得开发者无需关心线程创建和同步的细节,只需要关注并行化的基本逻辑即可。 2. *...

    fucking-java-concurrency::carp_streamer:简单地展示Java并发问题的案例,看看:see-no-evil_monkey:相信:monkey_face:

    他妈的Java并发 :backhand_index_pointing_right:通过Demo演示出Java中并发问题。 :red_apple:整理Demo的原因 可以观察到的实际现象 :see-no-evil_monkey:比说说的并发原则 :speak-no-evil_monkey:更直观更可信。...

    C++ concurrency cheatsheet

    1. std::thread类 std::thread是C++11标准库提供的一个用于创建和控制线程的类。它允许我们创建一个线程,将一个可调用对象和参数传递给它,并控制线程的运行。 - 创建线程:通过传递一个可调用对象(如函数、...

    C++ Concurrency in Action 源码

    《C++ Concurrency in Action》是一本深入探讨C++并发编程的权威著作,作者是Anthony Williams。这本书通过详细的实例和源代码,引导读者理解和掌握在C++中进行并发编程的关键概念和技术。源码文件列表中提到的文件...

    后我::envelope_with_arrow:通过简单的Promise API使用Web Worker和其他Windows

    我使用简单的基于Promise的API与Web Workers和其他Windows进行通信 使用post-me ,父母(例如主应用程序)和孩子(例如工作人员或iframe)可以很容易地将方法和自定义事件彼此公开。产品特点 :repeat_button: 父母和...

    parallel-hashmap:一系列仅标头,非常快速且对内存友好的hashmap和btree容器

    并行哈希图 概述 该存储库旨在提供一组出色的哈希映射实现,以及std :: map和std :: set的btree替代品,具有以下特征: 仅标头:无需构建,只需将parallel_hashmap目录复制到您的项目中就可以了。...

    harmony::musical_notes:使用DP按照惯用的语音引导程序生成四部分和声!

    和谐使用DP按照惯用的语音引导程序生成四部分和声! &gt;&gt; &gt; voiceProgression ( 'B-' , 'I I6 IV V43/ii ii V V7 I' ) 请参见的Web界面。 这是用。...WEB_CONCURRENCY= &lt; NUM&gt; gunicorn app执照根据。

    数据库系统课件:ch15-16 Transactions & Concurrency Control.ppt

    数据库系统课件:ch15-16 Transactions & Concurrency Control.ppt

    08_mt_l2s_concurrency

    【标题】"08_mt_l2s_concurrency" 指的是一个关于“LINQ to SQL”的视频教程,重点可能是讲解在多线程环境下的并发控制。LINQ(Language Integrated Query,语言集成查询)是.NET Framework中的一项技术,它允许...

    CPP-Concurrency-In-Action-2ed-2019-master.zip

    1. **线程基础**:介绍如何创建和管理线程,理解线程的状态和生命周期,以及线程之间的通信机制。 2. **同步原语**:详述std::mutex、std::lock_guard、std::unique_lock等同步工具的使用,防止数据竞争和死锁。 3...

    Concurrent_Programming+Java Concurrency in Practice+langspec

    首先,"Java Concurrency in Practice"是Java并发编程的经典之作,由Brian Goetz、Tim Peierls、Joshua Bloch、David Holmes和Doug Lea合著。这本书提供了一套实用的指导原则、设计模式和最佳实践,帮助Java开发者...

    用C++ concurrencytask实现异步编程(附代码实例).rar

    1. **任务创建与启动** 使用`concurrency::create_task`函数来创建一个新的任务。这个函数接受一个可调用对象(如函数、函数指针、lambda表达式等),并返回一个`concurrency::task`对象。一旦创建了任务,就可以...

    CPP-VS2012-PPL.rar_VS2012

    1. **任务(Task)**:PPL 中的任务是并行执行的基本单元。开发者可以创建任务来执行特定的工作,并且这些任务可以在不同的线程或处理器上并发运行。PPL 提供了 `concurrency::task` 类,允许开发者创建、调度和等待...

    C++ REST SDK开发HTTP服务器

    通过使用`concurrency::task`,我们可以编写非阻塞的代码,使得服务器能够同时处理多个客户端连接。 此外,C++ REST SDK的`json`模块提供了方便的接口,用于JSON数据的序列化和反序列化。这对于与RESTful API交互...

    C++ Concurrency in Action 中英文及代码

    《C++ Concurrency in Action》是一本深入探讨C++并发编程的专业书籍,旨在帮助开发者理解和掌握多线程、异步编程以及同步机制等关键概念。这本书提供了中英文两个版本,以便不同语言背景的读者理解,并且附带了源...

    object_threadsafe:我们将任何对象的线程安全性和std :: shared_mutex的速度提高10倍,以实现读取率> 85%的无锁算法的速度

    1. **读写分离**:将读取操作和写入操作分开处理,使大多数线程可以并行执行读取。 2. **自旋锁**:在读写冲突较少时,使用自旋锁代替传统互斥锁,减少线程阻塞的时间。 3. **精细粒度的锁**:对资源进行细分,只...

    Transactions: Concurrency Control and Recovery: Optimist concurrency control

    其中,乐观并发控制(Optimistic Concurrency Control, OCC)是一种不同于传统的基于锁的并发控制机制的方法。 #### 乐观并发控制简介 乐观并发控制作为一种对传统两阶段锁定(2PL)方法的反应而出现。两阶段锁定...

    C++标准库详解

    1. **输入/输出流(I/O Stream)**:C++标准库中的`iostream`模块定义了用于处理输入和输出的基本类,如`std::cin`、`std::cout`、`std::cerr`和`std::clog`。它们分别对应于标准输入、输出、错误和诊断流。通过这些...

Global site tag (gtag.js) - Google Analytics