Java多线程

进程与线程的理解

多线程的实现

  • Thread类–继承
  • Runable接口–实现
  • Callable接口–实现

Thread类

  • 建立一个线程对像
  • 开启多线程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class threadstest extends Thread{
// 有两种创建线程的方法
// 第一种就是通过继承 Thread 然后重写run的方法
@Override
public void run(){
for (int i = 0; i<100; i++){
System.out.println("这里是多线程----------------run");
}
}

public static void main(String[] args) {
// 建立一个多线程中的实例
threadstest thread = new threadstest();
// 开启多线程
thread.start();

for (int i = 0; i<1000; i++){
System.out.println("这里是主线程");
}
}

Runnable 接口—实现

  • 创建一个线程
  • 通过线程创建一个线程对象,这里使用代理
  • 利用线程对象启动多线程
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
package TestFile.ThreadTest;

public class RunableTest implements Runnable{
@Override
public void run(){
for (int i = 0; i < 100; i++) {
System.out.println("这是一个子线程-----------");
}
}

public static void main(String[] args) {
// 创建一个线程
RunableTest p1 = new RunableTest();
RunableTest p2 = new RunableTest();
// 通过线程对象,开启线程-------代理
Thread thread1 = new Thread(p1);
Thread thread2 = new Thread(p2);
// 多线程
thread1.start();
thread2.start();

for (int i = 0; i < 1000; i++) {
System.out.println("这是主线程");
}
}
}

多线程操作一个对象–Runnable接口实现

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
// 多个线程抢票
public class multiThreadandOneSource implements Runnable {
// 票数
private int ticketNums = 10;

@Override
public void run() {
while (true){
if (ticketNums<=0){
break;
}

System.out.println(Thread.currentThread().getName()+"-->抢到了第"+ticketNums--+"张票");
}

}

public static void main(String[] args) {
multiThreadandOneSource ticket = new multiThreadandOneSource();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 定义多个线程
new Thread(ticket, "学生").start();
new Thread(ticket, "老师").start();
new Thread(ticket, "黄牛").start();
new Thread(ticket, "老板").start();

}
}
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
// 模拟龟兔赛跑
// 这里也是多个线程用同一个对象
public class turtleRabbitGame implements Runnable{
private int distance = 100;
private static String winner;

@Override
public void run() {
while (true){
boolean flag = gameOver(distance);
if (flag){
break;
}
if (Thread.currentThread().getName().equals("兔子")){
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
distance--;
}
}

public boolean gameOver(int steps){
if (winner!=null){
return true;
} else{
if (steps<=0){
winner = Thread.currentThread().getName();
System.out.println("winner is "+ winner);
return true;
}
}
return false;
}

public static void main(String[] args) {
// 建立同一个资源
turtleRabbitGame race = new turtleRabbitGame();

new Thread(race, "兔子").start();
new Thread(race, "乌龟").start();



// turtleRabbitGame turtle = new turtleRabbitGame();
// turtleRabbitGame rabbit = new turtleRabbitGame();
//
// Thread turtleThread = new Thread(turtle, "乌龟");
// Thread rabbitThread = new Thread(rabbit, "兔子");
// turtleThread.start();
// try {
// Thread.sleep(200);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// rabbitThread.start();
}
}