java多线程

一.多线程,多进程

一个进程可以有多个线程

二.线程的创建

1.Thread class

(继承自Thread类 重点)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.codelorni.demo;

public class TestThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 20; i++){
System.out.println("我在看代码"+i);
}
}

public static void main(String[] args) {
TestThread testThread = new TestThread();
testThread.start();

for (int i = 0; i < 20; i++) {
System.out.println("我在学习多线程"+i);
}
}

}

2.Runnable接口

(实现 Runnable 接口 重点)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.codelorni.demo;

public class TestThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println("我在看代码");
}
}

public static void main(String[] args) {
TestThread testThread = new TestThread();
//通过线程对象开启我们的线程,代理
// Thread thread = new Thread(testThread);
// thread.start();
//等价于下面
new Thread(testThread).start();
for (int i = 0; i < 1000; i++) {
System.out.println("我在学习多线程");
}
}
}

3.Callable 接口

(实现 Callable接口 了解)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.codelorni.demo;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class TestThread implements Callable<Boolean> {


@Override
public Boolean call() throws Exception {
return null;
}
public static void main(String[] args) {
TestThread testThread = new TestThread();
//执行创建任务
ExecutorService ser = Executors.newFixedThreadPool(3);
//提交执行
Future<Boolean> result = ser.submit(testThread);
//获取结果
boolean r1 = result.get();
//结束
ser.shutdownNow();
}
}

三.并发问题

1.初时并发问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.codelorni.demo;

public class TestThread implements Runnable {
private int ticketNums = 10;

@Override
public void run() {
while (true) {
if (ticketNums <= 0) {
break;
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "拿到了第" + ticketNums-- + "张票");

}
}

public static void main(String[] args) {
TestThread testThread = new TestThread();

new Thread(testThread, "小明").start();
new Thread(testThread, "小李").start();
new Thread(testThread, "小张").start();

}


}
//多个线程操作同一个资源,线程不安全,数据紊乱

四.静态代理模式

  1. 真实对象和代理对象都要实现同一个接口
  2. 代理对象要代理真实对象
  3. 代理对象可以做真实对象做不了的事情
  4. 真实对象专注做自己的事情
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.codelorni.demo;

public class StaticProxy {
public static void main(String[] args) {
MarryProxy marryProxy = new MarryProxy(new You());
marryProxy.happyMarry();
}

}

interface Marry {
void happyMarry();
}

class You implements Marry {

@Override
public void happyMarry() {
System.out.println("happy marry!");
}
}

class MarryProxy implements Marry {
private Marry target;

public MarryProxy(Marry target) {
this.target = target;
}

@Override
public void happyMarry() {
before();
this.target.happyMarry();
after();
}

private void before() {
System.out.println("before");
}

private void after() {
System.out.println("after");
}


}

五.Lambda表达式

  • 避免匿名内部类定义过多
  • 可以让你的代码开起来很简洁
  • 去掉了一堆没有意义的代码

接口只包含一个抽象方法,那么它就是函数式接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.codelorni.demo;

public class TestLambda {
//静态内部类
static class Like2 implements ILike {

@Override
public void lambda() {
System.out.println("i like lambda2!!!");
}
}

public static void main(String[] args) {
Like like = new Like();
like.lambda();

Like2 like2 = new Like2();
like2.lambda();

//局部内部类
class Like3 implements ILike {

@Override
public void lambda() {
System.out.println("i like lambda3!!!");
}
}
Like3 like3 = new Like3();
like3.lambda();

//匿名内部类
ILike like4 = new ILike() {

@Override
public void lambda() {
System.out.println("i like lambda4!!!");
}
};
like4.lambda();

// lambda
ILike like5 = () -> {
System.out.println("i like lambda3!!!");
};
like5.lambda();

}
}

interface ILike {
void lambda();
}

class Like implements ILike {

@Override
public void lambda() {
System.out.println("i like lambda!!!");
}
}