多线程编程②[Java]

多线程编程②[Java]


  • 线程就是独立的执行路径
  • 在程序运行时,即使没有自己创建线程,后台也会存在多个线程,如gc线程,主线程。
  • main()称之为主线程,为系统的入口点,用于执行整个过程;
  • 在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为的干预的;
  • 对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制;
  • 线程会带来额外的开销,如cpu调度时间,并发控制开销。
  • 每个线程在自己的工作内存交互,加载和存储主内存控制不当会造成数据不一致。

创建线程的三种方式

  • 继承Thread类
  • 实现Runnable接口
  • 实现Callable接口

线程方法

  • sleep()
    • 使线程停止运行一段时间,将处于阻塞状态
    • 如果调用了sleep方法之后,没有其他等待执行的线程,这个时候当前线程不会马上恢复执行!
  • join()
    • 阻塞指定线程等到另一个线程完成以后再继续执行。
  • yield()
    • 让当前正在执行线程暂停,不是阻塞线程,而是将线程转入就绪状态;
    • 调用了yield方法之后,如果没有其他等待执行的线程,此时当前线程就会马上恢复执行!
  • setDaemon()
    • 可以将指定的线程设置成后台线程,守护线程;
    • 创建用户线程的线程结束时,后台线程也随之消亡;
    • 只能在线程启动之前把它设为后台线程
  • setPriority(int newPriority) getPriority()
    • 线程的优先级代表的是概率
    • 范围从1到10,默认为5
  • stop()停止线程
    • 不推荐使用

  1. 继承Thread类
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 cn.Thread;
/**
* 创建线程方式一:
* 1. 创建:继承Thread + 重写run
* 2. 启动:创建子类对象 + start
*
* @author HQF
*
*/
public class StartThread extends Thread{
/**
* 线程入口点
* @param args
*/

@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("一边听歌");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//启动线程
StartThread startThread = new StartThread();
startThread.start();

for (int i = 0; i < 20; i++) {
System.out.println(package cn.Thread;
/**
* 创建线程方式一:
* 1. 创建:继承Thread + 重写run
* 2. 启动:创建子类对象 + start
*
* @author HQF
*
*/
public class StartThread extends Thread{
/**
* 线程入口点
* @param args
*/

@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("一边听歌");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//启动线程
StartThread startThread = new StartThread();
startThread.start();

for (int i = 0; i < 20; i++) {
System.out.println("一边coding");
}
}
}


多线程——抢票

多线程并发要考虑线程安全。

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 cn.Thread;
//共享资源
public class Web12306 implements Runnable{
//票数
private int ticketNums = 99;

public void run() {
while(true) {
if (ticketNums < 0) {
break;
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "-->" + ticketNums--);
}
}

public static void main(String[] args) {
Web12306 web12306 = new Web12306();
System.out.println(Thread.currentThread().getName());

new Thread(web12306,"码畜").start();
new Thread(web12306,"码农").start();
new Thread(web12306,package cn.Thread;
//共享资源
public class Web12306 implements Runnable{
//票数
private int ticketNums = 99;

public void run() {
while(true) {
if (ticketNums < 0) {
break;
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "-->" + ticketNums--);
}
}

public static void main(String[] args) {
Web12306 web12306 = new Web12306();
System.out.println(Thread.currentThread().getName());

new Thread(web12306,"码畜").start();
new Thread(web12306,"码农").start();
new Thread(web12306,"码蟥").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
package cn.Thread;
/**
* 模拟龟兔赛跑
* @author HQF
*
*/
public class Racer implements Runnable{
private static String winner;
@Override
public void run() {
for (int step = 1; step <= 100; step++) {
//模拟休息
if (Thread.currentThread().getName().equals("rabbit") && step%25 == 0
) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

System.out.println(Thread.currentThread() + "-->" + step);
//比赛是否结束
boolean flag = gameOver(step);
if (flag) {
break;
}
}
}
private boolean gameOver(int step) {
if (winner != null) {//存在胜利者
return true;
}else {
if (step == 100) {
winner = Thread.currentThread().getName();
System.out.println("winner==>" + winner );
return true;
}
}
return false;
}

public static void main(String[] args){
// TODO Auto-generated method stub
Racer racer = new Racer();
new Thread(racer,"tortoise").start();
new Thread(racer,package cn.Thread;
/**
* 模拟龟兔赛跑
* @author HQF
*
*/
public class Racer implements Runnable{
private static String winner;
@Override
public void run() {
for (int step = 1; step <= 100; step++) {
//模拟休息
if (Thread.currentThread().getName().equals("rabbit") && step%25 == 0
) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

System.out.println(Thread.currentThread() + "-->" + step);
//比赛是否结束
boolean flag = gameOver(step);
if (flag) {
break;
}
}
}
private boolean gameOver(int step) {
if (winner != null) {//存在胜利者
return true;
}else {
if (step == 100) {
winner = Thread.currentThread().getName();
System.out.println("winner==>" + winner );
return true;
}
}
return false;
}

public static void main(String[] args){
// TODO Auto-generated method stub
Racer racer = new Racer();
new Thread(racer,"tortoise").start();
new Thread(racer,"rabbit").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
package cn.Thread;

/**
* 静态代理
* 1. 真实角色
* 2. 代理角色
* @author HQF
*
*/
public class StaticProxy {
public static void main(String[] args) {
new WeddingCompany(new You()).happyMarry();

//new Thread(线程对象).start();
}
}

interface Marry{
void happyMarry();
}

class You implements Marry{

@Override
public void happyMarry() {
System.out.println("你和嫦娥终于奔月了...");
}

}

//代理角色
class WeddingCompany implements Marry{

//真实角色
private Marry target;
public WeddingCompany(Marry target) {
this.target = target;
}
@Override
public void happyMarry() {
ready();
this.target.happyMarry();
after();

}

private void ready() {
System.out.println("布置猪窝。。。");
}

private void after() {
System.out.println(package cn.Thread;

/**
* 静态代理
* 1. 真实角色
* 2. 代理角色
* @author HQF
*
*/
public class StaticProxy {
public static void main(String[] args) {
new WeddingCompany(new You()).happyMarry();

//new Thread(线程对象).start();
}
}

interface Marry{
void happyMarry();
}

class You implements Marry{

@Override
public void happyMarry() {
System.out.println("你和嫦娥终于奔月了...");
}

}

//代理角色
class WeddingCompany implements Marry{

//真实角色
private Marry target;
public WeddingCompany(Marry target) {
this.target = target;
}
@Override
public void happyMarry() {
ready();
this.target.happyMarry();
after();

}

private void ready() {
System.out.println("布置猪窝。。。");
}

private void after() {
System.out.println("闹玉兔。。。");
}
}