Java多线程实战笔记一

一、 多线程与多进程的区别:

最本质的区别是每个进程拥有自己的一整套变量,而线程则共享数据。 共享变量使得线程之间的通信比进程之
间的通信更有效、更容易。同时,与进程相比,线程更加“轻量级”,创建、撤销一个线程比启动新继承的开销要
小得多。

二、Thread提供的主要方法

  1. Thread(Runnable r);
  2. void start();
  3. void run();
  4. Thread currentThread();
  5. static boolean interrupted();
  6. boolean isInterrupted();
  7. sleep(long s);
  8. void interrupt();
  9. void join();
  10. void join(long s);
  11. Thread.State getState();

三、 调用时机与主要区别

①创建线程主要有两种方式,一种是继承Thread,重写run方法,另一种是实现Runnanble接口,并作为Thread的一个参数。代码示例如下:

//继承Thread
class MyThread extends Thread{
    @Override
    public void run(){
        System.out.println("hello my thread");
    }
}
Thread thread = new Thread(new MyThread());

//实现Runnable接口
class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("hello my runnable");
    }
}
Thread thread = new Thread(new MyRunnable());    

//也是实现Runnable接口,通常为了方便会使用这种方式
Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try{
                Thread.sleep(2000);
                t1.interrupt();
            }catch (InterruptedException e){
                e.getMessage();
            }
        }
    });

②启动线程

thread.start();

注意:直接调用run方法只是在原来的线程执行run方法与普通的方法并没有区别,而调用是start方法则会新创建一个线程,并在该新线程中执行run方法。

③线程的中断

虽然有强制中断线程的stop方法,但是已经被弃用。现在一般是通过设置中断标志位的方式来实现线程中断。即在线程中执行重复操作时,将线程的中断标志位作为执行循环的条件之一。

a. 通过Thread.currentThread()获取当前线程。
b. 通过thread.isInterrupted()来判断thread这个线程是否被中断置位,true代表被请求中断。
c. 通过Thread.interrupted()来判断执行这条语句的线程是否被中断置位,同时会清除该线程的中断状态。
d. 通过Thread.sleep(s)来使得当前线程进入休眠状态s毫秒(虽然中断和休眠好像没有什么联系,后面会讲)

先来个需求:如果我们有两个线程t1和t2,在t1中循环执行某些操作,同时t2要能决定t1什么时候结束。代码实现:

Thread t1 = new Thread(new Runnable(){
    @Override
    public void run(){
        while(Thread.currentThread.isInterrupted() == false && more work to do){
            //more work to do
        }
    }
});
Thread t2 = new Thread(new Runnable(){
    @Override
    public void run(){
        try{
            t1.interrupt();
        }catch(Exception e){
            e.getMessage();
        }
    }
});
t1.start();
t2.start();

第一个挺简单的,没有什么陷阱,那再来一个,如果这个时候我们要求t1没处理完一次操作要休眠一段时间呢。
看起来好像很简单,之前也被坑过,难道不是直接在t1的循环体内添加Thread.sleep()并捕捉中断异常吗。正常逻辑是如此,可是sleep方法很奇特,如果中断标识被置位时执行sleep方法,sleep不但不休眠而且会清除中断标识的状态,也就是中断标识位和sleep同时“失效”,也就是不按照我们所想的方式执行。那么正确的做法应该是怎样呢。代码如下:

    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            try{
                while(true){
                    System.out.println(""+x++);
                    Thread.sleep(1000);//sleep和中断标志位的正确组合用法
                }
            }catch (InterruptedException e){
                e.getMessage();
            }
        }
    });
    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
            try{
                Thread.sleep(2000);
                t1.interrupt();
            }catch (InterruptedException e){
                e.getMessage();
            }
        }
    });
    t1.start();
    t2.start();

四、小结

①Thread.currentThread().isinterrupted() 与 Thread.interrupted()的主要区别在于前者只做判断,而后者除了做判断外还会清除线程的中断状态。
②Thread.sleep()也会清除线程的中断状态,并且会抛出InterruptedException的异常,从而使得中断状态取消并且不会进入休眠状态。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容