黑马程序员——多线程

来源:互联网 发布:淘宝网旅游鞋女 编辑:程序博客网 时间:2024/04/28 18:32
                             ------ >Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
     
                                                                      菜鸟黑马
    第一次开通博客,略微有些兴奋,在这个全民自由发言的时代,我也可以在互联网上写出自己的文章,这对不太喜欢表达自己内心想法的我来说是一次不小的突破,就当成自己的日记来写吧。
    15年考研的硝烟还没完全散去,知道成绩的那一刻,就觉得今年要没戏了,毕竟东南大学的通信专业是不好考的,又赶上今年国家政策变化,留给通信专硕统招的名额只有三十多个,东南大学,以后有缘再续! 读研不成,马上要重整旗鼓,投入到下一步中,经过一番考虑和收集信息之后,决定学习编程语言,踏入互联网浪潮,走上软件开发之路。选择了黑马学习JAVA,踏上新的征程。加油吧小伙!
    经过基础测试,觉得JAVA是一种比较有意思的语言,相比C语言更加高级,对我来说面向对象思想更加易于理解。今天学习毕向东老师视频的第11天,下面就说下今天的学习内容和收获:Java中的多线程。
    多线程是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫多线程。
   线程 Thread每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.
线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和 为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。
    自定义线程通畅有两种方法:一.继承Thread类,
             分为三个步骤:1.定义类继承Thread类;
                          2.复写Thread类中的run方法,目的是运行自定义run方法中代码;
                          3.调用线程的start方法,目的是启动线程,调用run方法,同时多线程具有随机性。
    以下是一个简单的示例代码:
import java.lang.Thread;class Demo extends Thread{public void run(){for (int x=0;x<60 ;x++ )System.out.println("Demo run" + x);}}class ThreadDemo{public static void main(String[] args) {Demo d=new Demo();  //创建新的线程d.start(); //开启线程并执行该线程的run方法//d.run();   //仅仅调用方法,而线程创建了却没有运行for (int x=0;x<60 ;x++ ){System.out.println("Hello World!" + x);} }}
        Therad类用于描述线程,该类定义一个功能,存储线程要运行的代码,该存储功能就是run方法。
         当要创建的类已经继承了其他类,这时无法再继承Thread类,下面创建线程的第二种方法出场,即用Runnable接口实现创建新线程。有以下步骤:
1.定义类实现Runnable接口;
2.覆盖Runnable接口中的run方法;
3.通过Thread类建立线程对象;
4.将Runnable接口的子类对象作为实参传递给Thread类中的构造函数;因为自定义的run方法所属的对象是Runnable接口的子类对象,所以要让线程指定对象的run方法;
5.调用Thread类的start方法开启线程并调用Runnable接口子类的run方法;
以下是用该方法编写的一个小代码块:
/*需求:银行有一金库,有两个储户分别村300,每次存100,存3次如何找问题?1.明确哪些代码是多线程代码2.mq共享数据;3.明确多线程代码中哪些语句操作共享数据*/import java.lang.Thread;class  Bank{private int sum;//Object obj =new Object();public  synchronized void add(int n)   //同步函数{//synchronized(obj)//{sum=sum+n;try{Thread.sleep(10);} catch(Exception e){}System.out.println("sum="+ sum);//}}}class Cus implements Runnable{private Bank b=new Bank();public void run(){for (int x=0;x<3 ;x++ ){b.add(100);}}}class BankDemo{public static void main(String[] args){Cus c=new Cus();Thread t1=new Thread(c);Thread t2=new Thread(c);t1.start();t2.start();}}

实现方式和继承方式两周方法的比较:
       实现方式避免了单继承的局限性,定义线程时,建议使用实现方式,二者区别在于:继承方式中,线程代码存放在Thread子类的run方法中,实现方式中,线程代码存放在接口子类的rnu方法中。
     多线程中的安全问题不可忽视,当多条语句操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没执行完,另一条线程参与进来执行,导致共享数据错误。Java中对多线程安全问题提供了专业的解决方式就是同步代码块。





0 0