Java并发相关

 

线程的基本操作:

       1,新建线程:这个不用说了,通过继承Thread或者实现Runnable接口两种方式。

       2,终止线程:一般来说,线程执行完毕就会结束,无须自动关闭。但是对于一些while true的线程如果想关闭呢?Thread类里有stop()方法,但是已经不建议使用了。因为它是强制停止线程,无论线程处于什么状态,很容易出现线程正在处理一半数据被停止的情况,这样非常容易造成数据不一致问题。所以慎用stop()(最好不用),通过下边这种方式来停止哪些无限循环的线程:
public class StopThread extends Thread {
    volatile boolean stopme = false;
    //停止方法
    public void stopMe() {
        stopme = true;
    }
    public void run() {
        while (true) {
            //死循环中如果出现停止标识,则直接跳出
            if (stopme) {
                System.out.println("exit by stop me");
                break;
            }

3,线程中断:是一种线程协作机制。是告诉目标线程一个中断通知,至于接到通知后如何处理,则有线程自己决定处理。

public class InterruptThread {
    /**
     * public void interrupt() 中断线程
     * public static boolean interrupted() 判断是否被中断,并清除当前中断标识
     * public boolean isInterrupted() 判断是否被中断
     */
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread() {
            @Override
            public void run() {
                while (true) {
                    //判断如果有中断标识,则直接跳出
                    if (Thread.currentThread().isInterrupted()) {
                        System.out.println("exit by interrupted");
                        break;
                   }
                    System.out.println(System.currentTimeMillis());
                    Thread.yield();
                }
            }
        };
        t1.start();
        Thread.sleep(2000);
        //打上中断标识
        t1.interrupt();
    }
}

 4,等待(wait)和通知(notify),也是为了支持线程之间的协作。方法都是在Object上定义的,例如线程A调用了obj.wiat()方法,那么线程A就会停止执行,等到其它线程调用obj.notify()方法为止。

public class WaitNotifyThread {
    final static Object ob = new Object(); 
    public static class T1 extends Thread {
        public void run() {
            synchronized (ob) {
                System.out.println(System.currentTimeMillis() + "t1 is start"); 
                try {
                    System.out.println(System.currentTimeMillis() + "t1 is wait");
                    ob.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(System.currentTimeMillis() + "t1 is end"); 
            }
        }
    }
    public static class T2 extends Thread {
        public void run() {
            synchronized (ob) {
                System.out.println(System.currentTimeMillis() + "t2 is start");
                System.out.println(System.currentTimeMillis() + "t2 is notify start");
                ob.notify();
                System.out.println(System.currentTimeMillis() + "t2 is notify end");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(System.currentTimeMillis() + "t2 is end"); 
            }
        }
    }
 
    public static void main(String[] args) {
        Thread t1 = new T1();
        Thread t2 = new T2();
        t1.start();
        t2.start();
    }
}

5,挂起(suspend)和继续执行(resume):也是一对相对的操作,但是JDK也已经标示为废弃方法,不推荐使用。应为使用suspend()去挂起导致线程暂停的同时,并不释放资源,会阻塞其它线程,如果处理不当(例如resume()处理在suspend()之前了,就会导致一直阻塞),所以慎用。我们可以通过wait和notify来像实现stopMe()一样,实现自己一个挂起和继续执行操作。这里不再演示。
6,等待线程结束(join)和谦让(yield):类似现实生活中,我做这件事得等着它做完那件事,我为他让让步等。很容易理解的:
volatile:非常重要的关键字,如果用volatile修饰,虚拟机就会特殊处理,不能随意变动优化目标指令;并且修改后,各个线程都能看见它的改动,保证变量的可见性。在那个中共享变量是“一写多读”的情况下非常使用,保证修改及时可见。
线程组:非常容易理解的概念,如果线程过多,为了方便管理,有了线程组
线程安全和synchronized:线程安全就是针对共享资源能够高效有序的使用,不要出现同时修改,最终导致数据不一致的问题。而共享资源的同步使用即可解决。synchronized的作用就是实现线程间的同步。总结一下它的用法:1,指定加锁对象:给对象加锁,进入同步代码前要获得给定对象的锁:synchronized(obj);2,直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁:synchronized(this);3,直接作用于静态方法:相当于当前类加锁,进入同步代码前要获得当前类的锁。

https://blog.csdn.net/liujiahan629629/article/details/84312204

https://blog.csdn.net/liujiahan629629/article/details/84454908

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值