多线程并发
创建
启动
线程池
//创建线程池对象
ExecutorService pool = poolecutors.newFixedThreadPool(2);
MyRun myRun = new MyRun();
pool.submit(myRun);
pool.submit(myRun);
pool.shutdown();
同步
```
public synchronized void method() {
可能会产生线程安全问题的代码
}
```
死锁
```
synchronized(A锁){
synchronized(B锁){
}
}
```
Lock 接口
void lock():获得锁
void unlock():释放锁
等待和唤醒
wait():等待。将正在执行的线程释放其执行资格和执行权,并存储到线程池中
notify():唤醒。唤醒线程池中被 wait() 的线程,一次唤醒一个,而且是任意的
notifyAll():唤醒全部。可以将线程池中的所有 wati() 线程都唤醒
新建线程
继承Thread
class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
print(currentThread().getName()+" : "+i);
}
}
static void print(Object... obj){
for (Object o:obj) {
System.out.println(o.toString());
}
}
}
实现Runnable接口
Thread th=new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(currentThread().getName()+" : "+i);
}
}
});
th.start();
最简写法
new Thread(()-> {
for (int i = 0; i < 10; i++) {
System.out.println(currentThread().getName()+" : "+i);
}
}).start();
常用方法
sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
join() 等待此线程(子线程)执行完毕。
yield() 让步到Runnable状态,允许具有相同优先级的其他线程获得运行机会(依赖操作系统,不建议使用!!!)。
setPriority() 更改线程的优先级(依赖操作系统,不建议使用!!!)。
interrupt()它不能中断某个线程!它只是线线程发送一个中断信号,让线程在无限等待时(如死锁时)能抛出抛出,从而结束线程,但是如果你吃掉了这个异常,那么这个线程还是不会中断的!
wait()¬ify()属于Object类,配合使用控制线程同步
线程同步
public class SynThread {
public static void main(String[] args) throws Exception {
Object a=new Object();
Object b=new Object();
Object c=new Object();
MyRunnable ra=new MyRunnable("A",c,a);
MyRunnable rb=new MyRunnable("B",a,b);
MyRunnable rc=new MyRunnable("C",b,c);
new Thread(ra).start();
Thread.sleep(1000);
new Thread(rb).start();
Thread.sleep(1000);
new Thread(rc).start();
Thread.sleep(1000);
}
}
class MyRunnable implements Runnable{
private String name;
private Object prev;
private Object self;
public MyRunnable(String name, Object prev, Object self) {
this.name = name;
this.prev = prev;
this.self = self;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
synchronized(prev){
synchronized(self){
System.out.println(name);
self.notify();
}
try {
prev.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}