用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。
创建新线程
1.继承Thread
1 2 3 4 5 6
| class Comet extends Thread { public void run() { System.out.println("Orbiting"); orbit(); } }
|
2.实现Runnable接口
1 2 3 4 5 6 7 8 9
| class Asteroid implements Runnable { public void run() { System.out.println("Orbiting"); orbit(); } }
Asteroid maja = new Asteroid(); Thread majaThread = new Thread(maja);
|
Thread的状态
线程状态 |
说明 |
NEW |
A thread that is created but not started |
RUNNABLE |
A thread that is available to run |
BLOCKED |
An “alive” thread that is blocked waiting for a monitor lock |
WAITING |
An “alive” thread that calls its own wait() or join() while waiting on another thread |
TIMED_WAITING |
An “alive” thread that is waiting on another thread for a specified period of time; sleeping |
TERMINATED |
A thread that has completed |
Thread普通方法
方法 |
说明 |
getPriority() |
Returns the thread’s priority |
getState() |
Returns the thread’s state |
interrupt() |
Interrupts the thread |
isAlive() |
Returns the thread’s alive status |
isInterrupted() |
Checks for interruption of the thread |
join() |
Causes the thread to wait for another thread to complete |
setPriority(int) |
Sets the thread’s priority |
start() |
Places the thread into a runnable state |
Thread重载Object的方法
方法 |
说明 |
notify() |
Tells a thread to wake up and run |
notifyAll() |
Tells all threads that are waiting on a thread or resource to wake up, and then the scheduler will select one of the threads to run |
wait() |
Pauses a thread in a wait state until another thread calls notify() or notifyAll() |
Thread静态方法
方法 |
说明 |
activeCount() |
Returns number of threads in the current thread’s group |
currentThread() |
Returns reference to the currently running thread |
interrupted() |
Checks for interruption of the currently running thread |
sleep(long) |
Blocks the currently running thread for parameter number of milliseconds |
yield() |
Pauses the current thread to allow other threads to run |
线程的同步
线程同步采用关键字synchronized,意味着对代码块或者方法加锁,使用场景有:
多线程工具包
java对多线程提供了工具包java.util.concurrent
线程池 Executors
Executors提供了工厂方法来创建线程池
方法 |
说明 |
newCachedThreadPool() |
Creates an unbounded thread pool that automatically reuses threads |
newFixedThreadPool(int nThreads) |
Creates a fixed-size thread pool that automatically reuses threads off a shared unbounded queue |
newScheduledThreadPool(int corePoolSize) |
Creates a thread pool that can have commands scheduled to run periodically or on a specified delay |
newSingleThreadExecutor() |
Creates a single-threaded executor that operates off an unbounded queue |
newSingleThreadScheduledExecutor() |
Creates a single-threaded executor that can have commands scheduled to run periodically or by a specified delay |
使用实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
RTask t1 = new RTask("thread1"); RTask t2 = new RTask("thread2");
ExecutorService threadExecutor = Executors.newFixedThreadPool(2);
threadExecutor.execute(t1); threadExecutor.execute(t2);
threadExecutor.shutdown();
|
线程安全集合类
尽管集合类可以被同步,但最好使用java提供的线程安全集合类。
集合类 |
对应的线程安全集合类 |
HashMap |
ConcurrentHashMap |
TreeMap |
ConcurrentSkipListMap |
TreeSet |
ConcurrentSkipListSet |
Map subtypes |
ConcurrentMap |
List subtypes |
CopyOnWriteArrayList |
Set subtypes |
CopyOnWriteArraySet |
PriorityQueue |
PriorityBlockingQueue |
Deque |
BlockingDeque |
Queue |
BlockingQueue |
同步器/信号量
类型 |
说明 |
Semaphore |
Maintains a set of permits |
CountDownLatch |
Implements waits against sets of operations being performed |
CyclicBarrer |
Implements waits against common barrier points |
Exchanger |
Implements a synchronization point where threads can exchange elements |
时间单位常量TimeUnit
Constants |
Unit def. |
Unit (sec) |
Abbreviation |
NANOSECONDS |
1/1000 |
μs |
.000000001 ns |
MICROSECONDS |
1/1000 |
ms |
.000001 μs |
MILLISECONDS |
1/1000 |
sec |
.001 ms |
SECONDS |
sec |
1 |
sec |
MINUTES |
60 sec |
60 |
min |
HOURS |
60 min |
3600 |
hr |
DAYS |
24 hr |
86400 |
d |
上一篇:Python开源Web框架Tornado学习笔记
下一篇:使用hexo搭建github个人博客小结