线程类知识总结

启动线程的方法:

1.继承Thread类

public class MyThread extends Thread {
    private int count = 5;
    @Override
    public void run() {
        //Do Sth
    }
}

2.重写Runnable接口

public class MyRunnable implements Runnable{
    @Override
    public void run(){
        //Do Sth
    }
}

对于两个实现方式的使用方法,有一下不同:

public class Test {
    public static void main(String[] args){
        //Mythread
        MyThread myThread = new MyThread();
        myThread.start();
        //MyRunnable
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

线程中常用的方法、标示:

1.synchronized
此方法可以标记线程同步,范例:

synchronized public void run(){
        //Do Sth
    }

代码块中代码及为线程同步方法,所有线程在进入代码前,需要获得该方法的锁,线程在使用完毕方法后会释放方法锁,其他线程只有获得方法锁之后才可以开始进行线程操作。
多个对象多个锁:该关键词锁的是对象,当新建多个对象时,多个线程会保持线程安全。假如多个线程的对象是同一个,使用synchronized会保证线程持有该对象的锁。
为什么是锁对象:当一个对象被锁定的时候,其非线程安全方法可以进行异步调用。通俗的解释就是,只有使用synchronized标识符的方法才会进行线程安全同步,当线程A调用方法1时,线程B依旧可以调用方法3。其线程安全方法会进行同步排队调用。加上synchronized标识符的方法会进行线程同步,当线程A调用方法1获得对象锁后,加入线程B调用方法2需要对其进行调用,则需要等待线程A释放对象锁才可以进行。

synchronized public void method1(){}
synchronized public void method2(){}
public void method3(){}

调用同一个对象时,可以锁重入:当一个对象拥有多个方法,且多个方法都拥有synchronized标识符,当一个线程通过方法1得到一个对象锁之后,再次调用该对象中方法2能够再次获得该对象锁
synchronized关键词不具有继承性:父类的同步方法无法被子类复写后继承。
synchronized可以只同步语句块:假如方法过于隆长,使用synchronized修饰方法往往会造成线程A占用大量时间,其他的线程需要进行等待,此时使用关键词进行语句块同步就是一个好的办法。当使用同步代码块时,方法中只有被同步代码块包裹的地方是同步的,其他都是异步执行的。
这里有一点需要注意,当一个对象中一个方法块获得了锁,其他同部方法块都会处于等待状态。类似于方法之间的锁关系。且方法和同步代码块的锁获得关系和方法和方法之间锁获得关系是一致的。得到的结论就是,在获得锁的时候,获得的其实就是方法的锁。

public void method(){
	// Do sth nosynchronized
	synchronized(this){
	// Do sth synchronized
	}
}

synchronized可以只锁对象:当一个方法中有多个同步块,这个时候锁住this对象会浪费过多时间,这个时候可以使用锁对象的方式让不同的代码块获得不同的锁。

private String anyString  = new String();
synchronized(anyString ){}

synchronized静态方法锁和非静态方法锁:静态方法锁的多个方法之间共用锁,类似于锁class的概念,非静态方法锁不共享锁块,且静态方法锁与非静态方法锁所共享锁块不同。

2.currentThread()方法
currentThread()方法可以返回代码正在被哪个线程调用的信息。

Thread.currendThread().getName();

3.isAlive()方法
isAlive判断当前当前线程是否处于活动状态。

this.isAlive();

4.sleep()方法
sleep()方法的作用是可以让当前的线程在指定的毫秒时间内由正在执行线程转变为休眠状态。

synchronized public void run(){
       Thread.sleep(5000);
    }

5.getId()方法
getId()方法可以获取线程的唯一标识。

Thread thread = Thread.currenThread();
thread.getId();

6.interrupted()方法
interrupted()方法,是给线程打上一个标记,后续需要进行判断并进行适当处理才可以将线程退出。

for(//循环条件){
	if(this.inturrupterd()){
		//dosth
		break;
	}
}

可以捕获异常,使得线程 停止.
程序可以获取InterruptedException异常,当调用inturruppted()方法时可以截取到次异常,并根据异常来停止线程。

publci void run(){
	while(true){
		if(this.isinturrupted){
			return;
		}
		//Do Sth
	}
}

配合使用inturrupted()方法,可以使用return造成线程停止

7.volatile关键字
主要作用是使变量在多个线程中可见。如何实现:强制从公共栈中取得变量的值,而不是从线程私有数据栈中取变量值。
但是它的致命缺点是其不支持原子性

8.wait()方法和notify()方法
wait()方法就是线程在运行时,需要将线程暂停,并将锁释放将资源给其他线程使用时所使用的方法,另外wait()方法必须获取锁后才能够使用不然会报错。在等待之后线程并不会被杀死,这个时候需要notify()方法对其进行进行唤醒

notify()方法在调用时只随机唤醒一个方法,在使用notifyAll()方法时会随机唤醒所有方法,但是其获取锁的顺序并不会像优先级一样获取,获取的等级也是随机的,加入优先级会部分提升该线程的效率。

wait(long)方法,在等待一定时间后自动唤醒该线程。

不常用的方法,概念

1.yield()放弃当前CPU资源,给别人用。这个方法通常很鸡肋,就是放弃一下,这个线程立马又会回到争夺资源的大军。有点像你本来在玩游戏,结果短线了,你现在要和别人同时再进服务器一样,这个方法功能就是让你的线程断线一次。

2.线程优先级,setPriority()方法
线程优先级在1-10中,当两个线程运行足够长久时,绝大多数情况下,是高优先级的线程先执行完,但是当线程等级差别不多的时候,短时间内的线程优先级具有随机性,随机性不能保证最后的执行结果是高优先级的线程完成的。

3.守护线程:典型的就是CG线程
当被守护的线程不存在时,守护线程会自动销毁

4.监测死锁
在代码上线之前,需要通过插件来监测是否有死锁可能出现,原始方法有jps命令。
To be continue

内部类和vollatile的部分章节没有进行深入阅读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值