文档章节

Thread

xiejuntao
 xiejuntao
发布于 2013/04/06 17:13
字数 1186
阅读 194
收藏 3

<p>1. 无论何种方式,启动一个线程,就要给它一个名字!这对排错诊断系统监控有帮助。否则诊断问题时,无法直观知道某个线程的用途。 <p>2. 程序应该对线程中断作出恰当的响应。 <p> 3. **ThreadLocal** <br>local variable(线程局部变量)。它的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。 <br>注意:使用ThreadLocal,一般都是声明在静态变量中,如果不断的创建ThreadLocal而且没有调用其remove方法,将会导致内存泄露。 <p>4、任务的提交者和执行者 <br>为了方便并发执行任务,出现了一种专门用来执行任务的实现,也就是Executor。由此,任务提交者不需要再创建管理线程,使用更方便,也减少了开销。 <br>java.util.concurrent.Executors是**Executor**的工厂类,通过**Executors**可以创建你所需要的Executor。有两种任务:**Runnable**、**Callable**。Callable是需要返回值的任务。 <br>Task Submitter把任务提交给Executor执行,它们之间需要一种通讯手段,这种手段的具体实现,通常叫做**Future**。Future通常包括get(阻塞至任务完成),cancel,get(timeout)(等待一段时间)等等。Future也用于异步变同步的场景。

<!-- lang: java -->
	ExecutorService executorService = Executors.newSingleThreadExecutor();
	Callable<Object> task = new Callable<Object>() {
		@Override
		public Object call() throws Exception {
			Thread.sleep(1000);
			return "222";
		}
	};
	Future<Object> future = executorService.submit(task);
	try {
       //future.get(3, TimeUnit.SECONDS); //等待三秒后超时,表示执行失败
       if(!future.cancel(true)){
		    System.out.println(future.get());
        }
	} catch (InterruptedException | ExecutionException e) {
		System.out.println("execute failed");
		e.printStackTrace();
	}
	System.out.println("sth");

<p>5、阻塞队列 <br>阻塞队列,是一种常用的并发数据结构,常用于生产者-消费者模式。 <br>在Java中,有三种常用的阻塞队列: <br>ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue <br>blockingQ.put(object);// 如果队列满则阻塞 <br>blockingQ.take(); // 如果队列空则阻塞 <br>blockingQ.poll(2, TimeUnit.SECONDS); //防止死等 <p>6、要执行wait操作,必须先取得该对象的锁。执行wait操作之后,锁会释放。被唤醒之前,需要先获得锁。

<!-- lang: java -->
synchronized (xxxx)  {
   xxxx.wait();
}

<br>要执行notify和notifyAll操作,都必须先取得该对象的锁。

<!-- lang: java -->
synchronized (xxxx)  {
   xxxx.notify();
}

<br>未取得锁就直接执行wait、notfiy、notifyAll会抛异常IllegalMonitorStateException。

<p>7、**ReentrantLock**和**Synchronized** <br>Synchronized是Lock的一种简化实现,一个Lock可以对应多个Condition,而synchronized把Lock和Condition合并了,一个synchronizedLock只对应一个Condition,可以说Synchronized是Lock的简化版本。 <br>不要在Lock和Condition上使用wait、notiffy、notifyAll方法,而是使用如下对应的方法。 <br>awati-> wait <br>singal-> notify <br>singalAll-> notifyAll <p>8、Java.util.concurrent中实现的原子操作类包括:AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference。 <p>9、**ForkJoinPool** <br>ForkJoinPool 是 Java SE 7 新功能“分叉/结合框架”的核心类。分叉/结合框架是一个比较特殊的线程池框架,专用于需要将一个任务不断分解成子任务(分叉),再不断进行汇总得到最终结果(结合)的计算过程。 <br>子任务由 ForkJoinTask 的实例来代表。它是一个抽象类,JDK 为我们提供了两个实现:RecursiveTask 和 RecursiveAction,分别用于需要和不需要返回计算结果的子任务。ForkJoinTask 提供了三个静态的 invokeAll 方法来调度子任务,注意只能在 ForkJoinPool 执行计算的过程中调用它们。 <br>以下代码计算磁盘指定目录里的子文件数

<!-- lang: java -->
package xjt.thread;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
public class CountFileTaskRecursive extends RecursiveTask<Integer> {
    private static final long serialVersionUID = 1L;
    int sum = 0;
    File file;
    public CountFileTaskRecursive(File file) {
	   this.file = file;
    }
    @Override
    protected Integer compute() {
	Integer csum = 0;
	List<CountFileTaskRecursive> tasklist = new ArrayList<CountFileTaskRecursive();
	if (file.isDirectory()){
		for (File f : file.listFiles()){
			CountFileTaskRecursive t = new CountFileTaskRecursive(f);
			tasklist.add(t);
		}
	} else{
		csum++;
            }
	if (!tasklist.isEmpty()){
		for (CountFileTaskRecursive t : invokeAll(tasklist)){
			csum += (Integer) t.join();
		}
	}
	return csum;
    }
    public static void main(String[] args) {
	CountFileTaskRecursive task = new CountFileTaskRecursive(new File("F:/soft"));
	Integer sum = (Integer) new ForkJoinPool().invoke(task);
	System.out.println(sum);
    }
}

10、CountDownLatch Java的concurrent包里面的CountDownLatch其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有 一个线程去操作这个计数器,也就是同时只能有一个线程去减这个计数器里面的值。你可以向CountDownLatch对象设置一个初始的数字作为计数值,任何调用这个对象上的await()方法都会阻塞,直到这个计数 器的计数值被其他的线程减为0为止。 参见http://zapldy.iteye.com/blog/746458

11、ConcurrentHashMap 参见http://www.infoq.com/cn/articles/ConcurrentHashMap

12、Thread.join() public final void join() throws InterruptedException Waits for this thread to die. Throws: InterruptedException - if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown. 参见http://my.oschina.net/zyc1016/blog/138581

© 著作权归作者所有

共有 人打赏支持
xiejuntao
粉丝 6
博文 27
码字总数 18349
作品 0
广州
程序员
私信 提问
【python 多线程 local 线程本地数据】local 线程本地数据

线程(run 方法) 之外的变量,多个线程竞争会有临界点问题,需要注意(如 worker3 就存在多个线程操作sum ,引起错乱) 线程(run 方法) 之内的变量,为单个线程独立所拥有 (如worker2) 线...

_______-
2018/10/06
0
0
多线程和CPU多核的问题

我电脑是四核的,我做了一个测试,开启两个线程,一个每一秒执行一次,一个每两秒执行一次,因为电脑是四核的,所以我预想的结果是两个线程可以同时执行,互不干涉。但是结果却不是这样的,从...

王大叔爱编程
2014/12/01
675
1
eventbus/documentation/delivery-threads-threadmode

Delivery Threads (ThreadMode) Contents [hide] 1 ThreadMode: POSTING 2 ThreadMode: MAIN 3 ThreadMode: BACKGROUND 4 ThreadMode: ASYNC EventBus can handle threading for you: events......

sarashare
2016/04/07
10
0
使用 ThreadLocal 来解决多线程之间数据共享

private static ThreadLocal<String> uuID = new ThreadLocal<String>(){ protected synchronized String initialValue(){ return null; } }; public static String getNextUUID(){ try { if......

gavin
2015/07/31
0
0
刚把 nutch2.2 成功跑起来了,为什么没抓的有数据呢???

nohup.out 文件内容 ,没有报错,往大神些随便指点下 InjectorJob: Using class org.apache.gora.memory.store.MemStore as the Gora storage class. InjectorJob: total number of urls re......

jack_peng
2013/09/24
2.4K
1

没有更多内容

加载失败,请刷新页面

加载更多

解决各浏览器向url中传中问参数的问题

https://www.cnblogs.com/godtrue/p/4333262.html 后台的处理代码 public static String getUrlnewName( String oldName) {String newName = "";try {String agent = inv.get......

踏破铁鞋无觅处
27分钟前
1
0
微信支付携带证书请求

package utils.wechat; import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.security.KeyStore; import javax.net.ssl.SSLContext;......

猿神出窍
35分钟前
2
0
1093 - You can't specify target table 'xxx' for update in FROM clause, Time: 0.002000s

1093 - You can't specify target table 'xxx' for update in FROM clause, Time: 0.002000s 根据结果集在b_order_copy1 表中删除 DELETE FROM b_order_copy1 WHERE Id in ( SELECT Id FRO......

lwenhao
35分钟前
1
0
JavaScriptCore全面解析

本文由云+社区发表 作者:殷源,专注移动客户端开发,微软Imagine Cup中国区特等奖获得者 JavaScript越来越多地出现在我们客户端开发的视野中,从ReactNative到JSpatch,JavaScript与客户端相...

腾讯云加社区
39分钟前
1
0
Jmeter参数的AES加密使用

在Jmeter日常实践中,大家应该都遇到过接口传参需要加密的情况。以登陆为例,用户名和密码一般都需要进行加密传输,在服务端再进行解密,这样安全系数会更高,但在使用jmeter进行接口测试的时...

程序猿拿Q
50分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部