首页 > 代码库 > Java thread(1)

Java thread(1)

 

这一部分主要讨论 java多线程的基本相关概念以及两种java线程的实现方式:

线程与进程:

    这个操作系统书上介绍得很详细,这里就列出一些比较主要的:

    线程: 线程本身有很少的资源,因为所拥有的资源较少,所以线程切换所花费在上下文切换的时候的开销也较少。线程是能够独立运行的最小的单位。多个线程之间共享进程所拥有的基本资源,线程之间对于某些数据的操纵可能会相互影响。

    进程: 运行当中的程序,多个进程之间,每个进程的内部数据对于其他进程而言是不可见的。

采用多线程的目的:

    采用多线程的目的就是为了最大限度地利用cpu的资源,从进程的层次而言,操作系统会有自己的一套进程调度的机制,让进程尽量充分地使用cpu,从更小的粒度来划分,在一个进程运行的过程中也不可能完全占用着cpu,这样要想让cpu更充分地被使用,就将一个进程的执行划分为几个线程的执行,当某一线程的处理不需要占用CPU而只和I/O等资源打交道,让需要占用cpu的其他线程有机会获得cpu资源,线程之间可以进行灵活地切换,这样能让cpu被利用的更充分。

    当程序启动的时候会自动创建一个主线程,主方法main就是在主线程上运行,程序全由线程来执行。Java中内置了对于多线程编程的支持,多线程含两个或者两个以上并发运行的部分,利用多线程可以编写出cpu利用率最大的高校程序,使得cpu的空闲时间最多。

Java中实现线程的两个基本方法:

    1继承Thread类 并且重写其中的run方法

    2继承Runnable接口 实现其中的run方法

详细说明:

    1 采用继承Thread类的方式来实现多线程直接采用没有形参的构造方法生成新的Thread类。其中的run方法中的内容就是这个线程所需要完成的事情,线程的启动只能通过Thread类的start()方法来进行,只有这样程序才能和操作系统进行交互,按照线程的方式进行启动,直接调用run()方法实际上还是单线程的方式。start方法是不可以被重写的,否则线程就没法正常启动了。

    2 采用实现Runnuble接口的方式实现多线程机制的时候,生成新的线程类的时候要将这个Runnable接口传入,采用以下的构造方法:Thread(Runnable target)

具体的例子:

package com.javase.thread;public class threadTest {    public static void main(String[]args){          //第一种方式实现    Thread t11=new Thread1("mythread");      //第二种方式实现 传入一个runnable参数    Runnable r=new Thread2();      Thread t2=new Thread(r);            //启动线程      t11.start();      t2.start();    }    }//注意这里要是重写构造方法的话 就要调用之前的 父类的构造方法     class Thread1 extends Thread{        int i;        public Thread1(){            super();        }        public Thread1(String string) {            super(string);        }        //重写run方法        public void run()        {            for(i=0;i<5;i++)            {System.out.println("the number for " + this.getName()+" is "+i);}            }    }        class Thread2 implements Runnable{        @Override        public void run() {            int i;            for(i=0;i<5;i++)            {System.out.println("the number for is"+i);}                    }            }
//运行结果/*the number for mythread is 0the number for is0the number for mythread is 1the number for is1the number for mythread is 2the number for is2the number for mythread is 3the number for is3the number for mythread is 4the number for is4*/

    上面的代码中用最基本的两个方法实现了两个线程,可以看到在Thread1中,为了给线程进行重命名,重写了构造方法,在其中调用了super(String),这个比较关键,这里实际上是调用了Thread类的Thread(String)的构造方法。在main函数中,通过将引用传入Thread类来生成一个新的线程,线程的名称采用默认的形式,之后我们会从具体代码的角度来分析两种线程实现机制的区别。