thread

线程的正确停止

二次信任 提交于 2020-03-02 17:04:17
线程停止的几种方式: 线程运行完成,正常停止 执行stop方法,暴力停止,现已弃用 执行interrupt方法,现在使用。 stop方法为什么被弃用? 使用stop方法终止线程会 释放掉此线程锁定的所有的监视器 ,如果线程修改了锁定对象的内容在还没有被正常处理之前线程被终止了。将会造成数据不一致的后果。 例如银行取款的例子:在线程A中进行取款操作,取款操作是一个同步方法,其中共有三个步骤:输入密码,取钱,修改余额。当用户a在输入密码,取钱之后,线程A.stop();线程终止。被修改的余额还没有写回数据库,从而造成数据混乱。 举例说明:首先定义一个操作类Login package com.feng.example; public class Login { private String username="a"; private String password="aa"; synchronized public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } synchronized public String getPassword() { return password; } public void

wait, notify, notifyAll and synchronized --

别说谁变了你拦得住时间么 提交于 2020-03-02 11:43:19
Object.notify()的API是这样的: Object.notify Class Overview | Class Members | This Package | All Packages Syntax public final native void notify() Description Wakes up a single thread that is waiting on this object's monitor. A thread waits on an object's monitor by calling one of the wait methods. This method should only be called by a thread that is the owner of this object's monitor. A thread becomes the owner of the object's monitor in one of three ways: By executing a synchronized instance method of that object. By executing the body of a synchronized statement that synchronizes on the object.

Thread Signaling

倾然丶 夕夏残阳落幕 提交于 2020-03-02 10:50:02
本文大概意思都是都下边链接文章转换过来的,没有进行一字一句的翻译,只是把大概意思整里出来。 http://tutorials.jenkov.com/java-concurrency/thread-signaling.html 线程信号的目的是为了线程之间相互通信。线程信号可以使线程等待另其他线程信号,例如thread B 或许等待从thread A 发出的数据准备处理信号。 1 Signaling via Shared Objects 线程之间可以通过共享对象来相互发送信号。Thread A 可以通过在synchronized同步块里设置变量 hasDataToProcess为true ,线程B同样在synchronized同步块里读取hasDataToProcess的值来确定是否有数据可读。 下面是一个简单的信号对象 public class MySignal{ protected boolean hasDataToProcess = false; public synchronized boolean hasDataToProcess(){ return this.hasDataToProcess; } public synchronized void setHasDataToProcess(boolean hasData){ this.hasDataToProcess =

多线程程序里不准使用fork

我是研究僧i 提交于 2020-03-02 05:56:37
多线程程序里不准使用fork 一般的,fork做如下事情 父进程的内存数据会原封不动的拷贝到子进程中 子进程在单线程状态下被生成 在内存区域里,静态变量 mutex 的内存会被拷贝到子进程里。而且,父进程里即使存在多个线程,但它们也不会被继承到子进程里。fork 的这两个特征就是造成死锁的原因。 #include <stdio.h> #include <unistd.h> #include <time.h> #include <pthread.h> void *doit(void *arg) { static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&mutex); fprintf(stderr, "lock... pid = %d\n", getpid()); /* 线程持有锁,进入睡眠 */ struct timespec tc = {10, 0}; nanosleep(&tc, 0); fprintf(stderr, "unlock... pid = %d\n", getpid()); pthread_mutex_unlock(&mutex); return NULL; } int main(int argc, char **argv) { pid_t pid; pthread

ThreadFactory & ThreadGroup

本秂侑毒 提交于 2020-03-01 23:56:21
原本想给 多线程任务 做一个挂起(暂停)功能,然后配合 httpcomponents-asyncclient 并发测试,结果意外令人汗颜,竟然CPU占用100%。。。 使用VisualVM观察CPU抽样,发现 org.apache.http.impl.nio.reactor.AbstractIOReactor.execute() 方法总是占用大部分CPU,然而没调用挂起操作时却一切正常。 这挂起操作的其中一环需要中断线程,这些线程均出产自自定义ThreadFactory : public class GroupThreadFactory implements ThreadFactory { private final ThreadGroup group; private final AtomicInteger threadNumber; public GroupThreadFactory() { this.group = new ThreadGroup("WorkerGroup"); this.threadNumber = new AtomicInteger(1); } public Thread newThread(Runnable r) { Thread t = new Thread(null, r, "pool-thread-" + threadNumber

【LLDB】高级运用与深入理解

僤鯓⒐⒋嵵緔 提交于 2020-02-29 21:52:08
###LLDB获取帮助 调用help命令来列出LLDB所有的顶层命令 ###LLDB高级运用 (lldb) e int $a = 2 (lldb) p $a * 19 38 (lldb) e NSArray *$array = @[ @"Saturday", @"Sunday", @"Monday" ] (lldb) p [$array count] 3 (lldb) po [[$array objectAtIndex:0] uppercaseString] SATURDAY (lldb) p [[$array objectAtIndex:$a] characterAtIndex:0] error: no known method '-characterAtIndex:'; cast the message send to the method's return type error: 1 errors parsing expression //lldb无法判定某一步的计算结果是什么数据类型 (lldb) p (char)[[$array objectAtIndex:$a] characterAtIndex:0] 'M' (lldb) p/d (char)[[$array objectAtIndex:$a] characterAtIndex:0] 77 (lldb) thread

tornado常见的异步非堵塞写法

倾然丶 夕夏残阳落幕 提交于 2019-12-21 10:52:54
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 非堵塞和异步有什么区别? 非堵塞 在tornado的框架中非堵塞一般指得是网络I/O层面的socket数据接收模式(select或者epoll),不论用哪个模式,最终程序都会收到数据并处理数据(这个数据要么被转发、要么被解析和处理)。 非堵塞的弊端: 如果处理一个密集计算的请求需要花费10秒钟(就是堵塞了10秒钟),当两个或多个请求同时到达时,只要第一个被接受处理没结束,其他全部请求都要等,并且挨个挨个等到被轮询结束。这就是单线程事件还回机制(非堵塞机制), 对堵塞零容忍, 任何一个地方堵住了还回线程,其他全部请求都被堵住。 也就是说采用了非堵塞模式之后,最好不要用堵塞(常规解析数据的函数)的代码块来解析数据。 异步 异步的作用是将堵塞代码错开来,不放在当前接受数据的线程中处理, 要么丢到rabbitmq/zeromq/activemq中交给另外一个进程去处理,要么用其他线程或进程来处理。 让监听数据的这个socket收到数据后直接抛给其他程序来处理,然后立马保持监听状态,这样子程序的循环能力就非常强。 再就是要提的一点,tornado本身的ioloop就采用epool/select/kqueue来完成非堵塞动作,咱们使用tornado只要把异步的代码写好就可以很好的发挥出tornado的优势了。

Android 主线程和线程之间相互发送消息

为君一笑 提交于 2019-12-15 17:39:26
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 通过分析Activity源码,我们知道每个Activity都有一个Looper,所以主线程在接收Message是不需要调用Looper.prepare()和Looper.loop(),但是线程是不带Looper的,当线程要接收来自主线程的消息是就需要调用Looper.prepare()和Looper.loop()。以下我们将通过一个示例,讲述主线程和线程之间如何发送Message。 import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.Toast; /** * 这个类是主线程,它每隔两秒就发送一个Message给线程,线程收到Message后将发送一个Message给主线程,主线程收到Message后会将Message内容Toast出来。 * org.fneg.HandlerTestActivity.java * Create at: 2012-6-4 下午9:39:19 * @author:feng * Email:fengcunhan@gmail.com * */ public class

RxJava(ReactiveX,Observable)的一些大白话

女生的网名这么多〃 提交于 2019-12-09 10:20:53
一部分人压根就没想过Publisher和Subscriber的代码分别在什么线程里执行, 做Android的人天然会意识到这个,因为很多例子里都会写subScribeOn(Schedulers.io())和observeOn(AndroidSchedulers.mainThread()),所以没问题。 做了个测试工程 RxJava_Test 。代码都是在 RxJava_Test.java 里。 得到几个大白话的结论,可不容易在reactivex的文档里明确找到。 文档里那一堆花花绿绿的图真的能够给人信心吗?虽说画的很有道理,连thread的颜色都有区别,可总不容大白话好啊。 1. 线程指定 如果subscribeOn和observeOn都不指定,那么所有的动作都在当前线程里顺序执行。他们的作用分别是指定了Publisher和Subscriber的动作在什么thread里执行。 subscribeOn(scheduler) 这个函数名字取得真不合适,让人误以为subscriber的回调函数执行在指定的thread里,实际上是指定了Publisher代码执行在指定的thread里。 非要抬杠的话,由于后续的subscriber默认就的确被调用在该thread里,而且publisher的动作实际是在OnSubscibe callback里才被执行的,所以这个函数名马马虎虎说得过去,但是

PHP关于VC9和VC6以及Thread Safe和Non Thread Safe版本选择

老子叫甜甜 提交于 2019-12-07 19:49:55
一、如何选择PHP5.3的VC9版本和VC6版本 VC6版本是使用Visual Studio 6编译器编译的,如果你的PHP是用Apache来架设的,那你就选择VC6版本。 VC9版本是使用Visual Studio 2008编译器编译的,如果你的PHP是用IIS来架设的,那你就选择VC9版本。 二、如何选择PHP5.3的Thread Safe和Non Thread Safe版本 Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍。 从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用多进 程的工作方式不同的是Windows系统是采用多线程的工作方式。如果在IIS下以CGI方式运行PHP会非常慢,这是由于CGI模式是建立在多进程的基 础之上的,而非多线程。一般我们会把PHP配置成以ISAPI的方式来运行,ISAPI是多线程的方式,这样就快多了。但存在一个问题,很多常用的PHP 扩展是以Linux/Unix的多进程思想来开发的,这些扩展在ISAPI的方式运行时就会出错搞垮IIS。因此在IIS下CGI模式才是 PHP运行的最安全方式