您的位置:首页 > 编程语言 > Java开发

【java基础】——线程

2015-09-04 20:51 477 查看

前言      

    在自考的《操作系统》中,我们也接触过线程这个东西,觉得它好难弄懂,当时要聚哥和王泽给我重复的讲才理解,现在到了软考里J2se视频里再次看到进程,觉得很熟悉。

概念

 线程

      线程是一个程序内部的顺序控制流。有没有觉得很官方,而且很难理解?而马老师则将得很简单,线程就是一个程序里不同的执行路径,在我们电脑里运行的是线程,所以说线程就是一条线。一个CPU只支持一个线程在运行,除非自己的电脑上装有两个cpu,也就是双核(现在才有些明白双核是什么概念了)。线程属于动态的概念。

                            


   线程有等待、就绪、运行、阻塞和终止6种状态,而这六种是互相转换的。

         


 
进程

      进程是class文件或excel文件,属于静态的概念。

线程的创建和启动

  线程可以通过继承Thread类重写run方法来实现。也可以通过接口实现。继承这个方法比较死板,继承之后就不能继承其它类,而接口方法还可以去调用实现其它方法,比较灵活,所以能用接口就不要用继承。

线程控制的基本方法

       1、isAlive():判断线程是否还“活”着,即线程是否还未终止;
   2、getPriority():获得线程的优先级数值。例如:在马路上闪着红灯发出它们特有声音的急求车、消防车、警车其他车都得为它们让道,它们可以直接过红灯。但是一般的汽车则不可以。
   3、setPriority():设置线程的优先级数值。如急求车、警车、消防车相遇的时候,是谁让谁呢,这还得看看它们所被设置的优先级别谁的比较高了。
   4、Thread.sleep():将当前线程睡眠指定毫秒数,它是可以调用Thread的静态方法,因此,sleep可以由类名直接调用。
 
public static void sleep(long millis) throws InterruptedExecption
//使得当前线程休眠(暂时停止执行millis毫秒)


   5、join方法:合并某个线程,如给自己电脑加个显示器,这个时候你在学习的时候,可以同时用两个显示器进行学习。
   6、yeild方法:让出CPU,给其他线程执行的机会。就如马老师说的,上厕所排队,有个人实在憋不住了,而你还能再等等,所以你就把上厕所的机会给那个人了。
   7、wait():当前线程进入对象的wait pool,这个方法类似于sleep方法。但是在线程加锁的情况下,用wait()方法后,锁就不属于自己了,而sleep()方法则还是抱着锁不放。
  8、notify()和notifyAll():这两个都是唤醒对象的wait pool中等待线程的方法,notify()是唤醒wait pool中的一个等待线程,而notifyAll则是唤醒wait pool中所有的等待线程。

线程同步

    线程同步就是连个线程同时进行,但是这种情况是不容许出现的,于是就产生了锁这个东西。如果我占用了一个线程,为防止其他人也来用这个线程,我就得在这个线程上加锁。在java中,用关键字synchronized来与对象对象互斥所联系,当某个对象Synchronized修饰是,表面该对象在任一是个只能有一个线程访问。就像一个人结了婚领了证一样,就不能和另外一个人结婚领证,不然他就犯了重婚罪。给线程加锁就容易出现死锁的情况,在操作系统中讲到这个问题可以用银行家算法来解决。例如你要向银行借款100万,但是人家只有80万,而另外一个人需要借60万,所以银行不会借给你,借给了需要60
万的那个人,等到银行拥有100万以上的金额时银行才有可能借给你。

总结

    线程这一块学习觉得很有共鸣,听起来也觉得听容易接受,马老师也讲得挺有趣的。这一块的理解就先到这了,如果有什么理解不到位的,欢迎大家指出。

      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: