Java多线程编程(三)线程的优先级、同步与死锁

线程的优先级:

  线程的优先级分为三种,分别是:

    1-MIN_PRIORITY

    10-MAX_PRIORITY

    5-NORM_PRIORITY

    如果什么都不设置默认值是5

 线程的优先级可以影响线程的执行顺序,当然这里指的是有可能影响,不会一定影响。在默认状态下(比如说主线程)它的默认值是5

具体代码演示:

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.yeqc.thread;
 
class ThRun implements Runnable{
 
    @Override
    public void run() {
        for(int i=0; i<5; i++){
            try {
                Thread.sleep(1000);
                System.out.println(Thread.currentThread().getName()+":"+i);
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
     
}
 
public class ThreadDemo03 {
 
    public static void main(String[] args) {
        Thread t1 = new Thread(new ThRun(),"A");
        Thread t2 = new Thread(new ThRun(),"B");
        Thread t3 = new Thread(new ThRun(),"C");
        t1.setPriority(Thread.MIN_PRIORITY);
        t2.setPriority(Thread.NORM_PRIORITY);
        t3.setPriority(Thread.MAX_PRIORITY);
        t1.start();
        t2.start();
        t3.start();
    }
 
}

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C:0
A:0
B:0
C:1
B:1
A:1
C:2
A:2
B:2
C:3
A:3
B:3
C:4
B:4
A:4


同步与死锁:

  1.同步代码块

    在代码块上加上“synchronized”关键字,则此代码块就称为同步代码块

  2.同步代码块格式:

1
2
3
    sychronized(同步对象){
        需要同步的代码块;
    }

  3.同步方法

    除了代码块可以同步,方法也是可以同步的

  4.方法同步格式:

1
    sychronized void 方法名称(){}

具体代码演示:

    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
34
35
36
37
package com.yeqc.thread;
 
class MythreadDemo implements Runnable{
     
    private int ticket = 5;
 
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            synchronized (this) {
                if (ticket>0) {
                    try {
                        Thread.sleep(500);
                    catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("车票:"+ticket--);
                }
            }
        }
    }
     
}
 
public class ThreadDemo04 {
 
    public static void main(String[] args) {
        MythreadDemo m = new MythreadDemo();
        Thread t1 = new Thread(m);
        Thread t2 = new Thread(m);
        Thread t3 = new Thread(m);
        t1.start();
        t2.start();
        t3.start();
    }
 
}

运行结果:

1
2
3
4
5
车票:5
车票:4
车票:3
车票:2
车票:1

    2.同步方法

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
package com.yeqc.thread;
 
class MythreadDemo implements Runnable{
     
    private int ticket = 5;
 
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            tell();
        }
    }
    public synchronized void tell(){
        if (ticket>0) {
            try {
                Thread.sleep(500);
            catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("车票:"+ticket--);
        }
    }
}
 
public class ThreadDemo04 {
 
    public static void main(String[] args) {
        MythreadDemo m = new MythreadDemo();
        Thread t1 = new Thread(m);
        Thread t2 = new Thread(m);
        Thread t3 = new Thread(m);
        t1.start();
        t2.start();
        t3.start();
    }
 
}

运行结果:

1
2
3
4
5
车票:5
车票:4
车票:3
车票:2
车票:1

/**

 *死锁:学生找工作(高新)

 * 企业需要你有工作经验(经验)

 */

本文转自yeleven 51CTO博客,原文链接:http://blog.51cto.com/11317783/1769371


上一篇:CSS-边框颜色 | border-color


下一篇:DHU Matlab Experiment【4】_验证非线性最小二乘拟合lsqcurvefit()函数中的误差平方和