多线程学习(1)

优点:多进程,多线程可以让程序不被阻塞.可以充分利用多核cpu的优势,提高运行效率
创建方式:
 

(1)通过继承Thread类,并重写其中的run方法来出创建


Thread t = new Thread() {
	public void run() { // 运行
		// 线程需要执行的代码
	    // 不能抛出检查异常,只能自己处理检查异常
	}
};

 (2)通过重写runnable中的run方法来创建


Runnable runnable = new Runnable() {
	public void run(){
		// 要执行的代码
	}
};
Thread t = new Thread( runnable );
t.start

线程中常见的问题(互锁)的提出与解决方案:
互锁

Object A = new Object();
Object B = new Object();


Thread a = new Thread(()->{
    synchronized (A) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        synchronized (B) {
            System.out.println("操作...");
        }
    }
});

Thread b = new Thread(()->{
    synchronized (B) {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        synchronized (A) {
            System.out.println("操作...");
        }
    }
});
a.start();
b.start();

 检测死锁可以使用 jconsole工具
死锁问题可以通过Wait方法与notefy方法结合解决:

public class Test12 {
static Object obj = new Object();
static boolean t2runed = false;// t2是否执行过
// 打印 2, 1
public static void main(String[] args) {

    Thread t1 = new Thread(() -> {
        synchronized (obj) {
            while(!t2runed) { // 如果t2没有执行过
                try {
                    obj.wait(); // 线程t1 先等一会
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println(1);
    });

    Thread t2 = new Thread(()->{
        System.out.println(2);
        synchronized (obj) {
            t2runed = true;
            obj.notify();
        }
    });

    t1.start();
    t2.start();
}
}

猜你喜欢

转载自blog.csdn.net/weixin_42827269/article/details/81607684