JAVA多线程

在程序编程中进程与线程是一个非常重要的概念,在大多人个人计算中只存在一块CPU也就是说在某一时间点电脑上只能运行一个任务;

        进程的概念可理解为一组硬件资源、程序和数据的集合,无论什么样的软件要完成一个功能(比如音频软件播放音频,视频软件播放视频)都需要各种硬件资源(CPU、内存空间或者声卡)及在程序运行过程中产生的各种数据;进程并不是一个具有实际意义的概念,我们可以把它当做各种资源的一个集合。

        线程是程序运行的基本单元,是分配各种资源的基本单位,是程序的真正的运行单位;一个进程必要包括至少一个主线程。举一个比较通俗易懂的实例:整台电脑相当于个生产工厂,工厂内拥有各种生产线可以生产各种产品,那么进程就相当于工厂内的某一个车间(车间内有各种机器和工人),线程相当于车间的具体的一个生产活动,但是工厂的电力供应是有限的只允许一项生产活动开工(电力供应就相当于电脑CPU),所以工厂内所有生产活动只能交替进行。

JAVA语言中的进程与线程

     java语言中提供两种实现多线程的方式Thread和Runnable。

    Thread是一个线程类,其他需要多线程方式的代码类通过集成此类来实现多线程,代码如下

package thread;
public class ThreadClass2 extends Thread{
public void run(){
//需要执行的代码

}
public static void main(String[]args){
ThreadClass2 t = new ThreadClass2();
t.start();
}

}

         实现方式很简单,只需要新建类来实现线程类Thread,然后在新建类中增加 void run 方法,然后通过实例化此类并通过调用对象的start()方法启动多线程。

  Runable 是一个接口,多线程类实现此接口及其void run()方法来实现多线程,实例代码如下:

      public class RunnableClass implements Runnable{
public RunnableClass(){

}
public static void main(String[] args){
RunnableClass r = new RunnableClass();
Thread t1 = new Thread(r);
t1.start();
}
@Override
public void run() {
//需要执行的代码
}
}

    通过比较以上2种不同的方式他们的相同点是都是通过调用Thread对象的start方法启动线程执行线程类的run方法(如果直接调用run方法的话这就不是多线程了,就和普通的方法调用没有了任何区别);java语言为什么会多此一举而不是直接调用run方法呢;下面是start方法的源代码:

     public synchronized void start() {
        /**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added 
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();
        group.add(this);
        start0();
        if (stopBeforeStart) {
   stop0(throwableFromStop);
}
    }


    private native void start0();

可以看到通过调用start()后其又调用了start0(),这个方式的修饰符是native,说明这个方法的具体方法体是由其它的编程语言来具体实现的,因为多线程的实现是与本地操作系统有密切关系,start0() 方法根据不同操作系统特性启动多线程进而执行run() 方法内的代码。

那为何java语言设计者会提供2种实现多线程的方式呢,继续看下Thread的声明体:

public  class Thread implements Runnable

Thread 类也是通过实现Runnable接口和run()而实现了多线程,所以两者的本质都是相同的,基础都是Runnable接口,Thread在实现Runnable接口的同时提供了对线程各种操作的方法为线程同步提供了基础实现;但是通过观察2种多线程实现代码可以发现;第一种方式对于多线程间无法共享资源,第二种方式可以很好的实现资源共享,在比如网上售票,网上购物等这种资源统一的分布式系统应用场景中无法使用第一种方式实现多线程。


       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值