java中的多线程
-
程序
-
文件
-
-
进程
-
线程
-
cpu调度的最小单位
-
一个进程中至少有一个线程,如果只有一个线程,则这个线程就是主线程(main线程)
-
Java中线程的创建
-
继承自Thread类
-
实现Runnable接口
线程安全性问题:
产生的原因
多个线程对象同时访问同一个全局变量
如何解决:
加锁(同步锁)
加锁方式:
-
同步代码块
-
synchronized
-
-
同步方法
-
声明方法时添加synchronized
-
-
加锁的对象
-
保证锁对象的唯一
-
线程池的介绍
-
池化技术
-
c3p0 dbcp ...
-
线程池
-
-
线程池的衍生
-
频繁的创建线程对象和多个线程之间进行上下文切换,是非常耗费时间和资源的,所以jdk1.5中提出了线程池技术
-
-
使用线程池
Executor
线程池的创建
创建固定大小容量的线程池(**)
ExecutorService pool = Executors.newFixedThreadPool(2);
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
pool.execute(task);
pool.execute(task);
pool.execute(task);//线程池的带下只有两个 现在这个任务在其等待队列中排队等候
**创建可变大小的线程池
ExecutorService pool = Executors.newCachedThreadPool();
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
pool.execute(task);
pool.execute(task);
pool.execute(task);
**创建独立任务的线程
ExecutorService pool = Executors.newSingleThreadExecutor();
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
pool.execute(task);
pool.execute(task);
pool.execute(task);
**创建可调度的线程
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(2);
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
threadPool.schedule(task, 2000, TimeUnit.MILLISECONDS);