多线程学习 第一天

本文仅供自己学习笔记记录,不作任何参考,我会将对具体知识的理解写在对应的方法前,方便自己理解学习。

 

学习多线程,那第一步,个人感觉应该就是怎么创建线程了。

首先,我通过资料得知,需要继承Thread类,或者实现Runnable接口。并重写其中的run()方法。

所以代码就如下了:

public class Test extends Thread {
    
    @Override
    public void run() {
        //do something
    }
}
public class Test implements Runnable {

    @Override
    public void run() {
        //do something
    }
}

实际上,Thread其实也是Runnable接口的子类,通过查阅资料得知,Thread的类定义为

public class Thread extends Object implements Runnable

通过阅读Thread类中部分代码,得知Thread类内部引用了Runnable接口,调用Thread的run方法,其实就是调用了Runnable接口中的run方法,所以如果是采用继承Thread类实现多线程,必须重写run()。

两种创建线程方法,那却别在哪里呢?

继承Thread类不适合资源共享,而继承Runnable,则可以实现资源共享。

继承Runnable还可以避免java单继承的限制

最后线程池仅仅能放入继承Runnable和callable的类,不能直接放入继承Thread的类

 

 

上边创建了线程,那接下来就是启动线程了

启动线程有,实例化继承Thread的类,并调用start,或者内部类解决,再或者通过实现runnable接口来调用。代码如下(接上方类)

public class TestMain {
    public static void main(String[] args) {
        Test test = new Test();
        test.start();
    }
}
public class TestMain {
    public static void main(String[] args) {
        Thread thread=new Thread(new Runnable() {
            @Override
            public void run() {
                //dosomething
            }
        });
        thread.start();
    }
}
public class TestMain {
    public static void main(String[] args) {
        Test test = new Test();
        Thread thread=new Thread(test);
        thread.start();
    }
}

 

现在启动了线程,那线程的周期状态应该做一定的了解,于是我了解到,线程的周期状态一般具有5种,如下

创建  : 就是上方记录到的创建线程

就绪  :创建了线程之后,并在启动start()方法之后,线程就就进入了就绪状态,通俗来讲就是,已经进入了线程队列,相当于现实中买车票排队了,就等到你了就可以买到票了。

运行  : 执行线程中的run方法内容

阻塞  : 当线程在执行的过程中,如果被人为的挂起操作,如sleep(),就会进入阻塞状态。 发生阻塞的时候,线程不能进入队列,只有阻塞消除,才能进入就绪状态。 通俗来讲就是 你买着票,突然来了警察例行检查,你得停下你手上的事。在检查完了之后,没问题了,重新排队购票。

死亡  : 执行stop()方法,或者执行run()方法结束

 

 

那创建和执行都知道了,那结束怎么办呢;

执行线程的stop()方法。

 

那如果我有两个线程,A线程想让B线程执行呢?

执行A线程的yield()方法

 

那如果我A线程突然不想跑了呢,想歇一下呢?

执行A线程的sleep()方法

 

那再如果我A线程结束时再执行B线程呢?

先执行A线程的join()方法,再执行B的start()方法

 

那再再如果,我AB线程同时进行的,B线程需要再A线程结束时同时结束呢?

b线程的setdeamon()为true,但需要再start()之前。 但我想到,这个设置为true的时候,一般是设置到main线程上的。main线程结束,b线程才结束,和A线程结束,B线程结束这样行不通啊(通过A线程里边调用B线程也可以,但我不是很想使用这种方法,之前有看过一篇文章,做定时任务,采用了这种方法),于是现在查阅资料中…………………………

----查找失败----直接进入下个问解决办法题,这个问题先保留,之后再看看有没有其他

 

上方都是单个线程,想到是否有类似组一样的,将自己 定义的线程放在一起呢?于是我找到了线程组ThreadGroup

在不定义线程组的情况下,所有的线程都在main线程组下,

要实现一个线程在一个组下,可采用

new Thread("线程组名","当前线程名称")
//当前线程名称可为null,会按照Thread-0自动递增,
//线程组名也可为null,默认当前方法的线程组

其他构造器如下:

Thread(ThreadGroup group,Runnable target):以target的run()方法为线程执行提创建新线程,新线程属于线程组group。

Thread(ThreadGroup group,Runnable target,String name):以target的run()方法为线程执行提创建新线程,并且输入group线程组,新线程名字为name。

Thread(ThreadGroup,String name):创建新线程,属于group线程组,新线程名字为name。

 

线程组可高效的管理多个线程,比如可以设置线程组为守护线程,也可同时打断线程组内的所有线程。

 

最后,今天看到一张图,引用以下 出处 : http://blog.csdn.net/evankaka

1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):线程对象创建后,其它线程调用了该对象的start()方法。

该状态的线程位于可执行线程池中,变得可执行,等待获取CPU的使用权。

3、执行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4、堵塞状态(Blocked):堵塞状态是线程由于某种原因放弃CPU使用权。临时停止执行。直到线程进入就绪状态,才有机会转到执行状态。堵塞的情况分三种:

(一)、等待堵塞:执行的线程执行wait()方法,JVM会把该线程放入等待池中。

(wait会释放持有的锁)

(二)、同步堵塞:执行的线程在获取对象的同步锁时。若该同步锁被别的线程占用。则JVM会把该线程放入锁池中。

(三)、其它堵塞:执行的线程执行sleep()或join()方法。或者发出了I/O请求时。JVM会把该线程置为堵塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时。线程又一次转入就绪状态。(注意,sleep是不会释放持有的锁)

5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值