java创建线程

来源:互联网 发布:登陆淘宝显示网络崩溃 编辑:程序博客网 时间:2024/06/12 18:39

线程

线程是隶属于操作系统的概念,是程序执行中的单个顺序流程。

进程是一个执行中的程序,是操作系统对其资源(内存和CPU时间等)进行分配的基本单位,每个进程都有自己独立的一块内存空间、一组系统资源,其内部数据和状态都是完全独立的。

多线程则是指一个进程中可以同时运行多个不同的线程,执行不同的任务。多线程意味着一个程序的多行语句看上去几乎同时执行。

线程与进程的不同点:同类的多个线程共享一个内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小得多,所以,线程被称为轻负荷运行。

 

Java产生线程有两种方法:一种是继承Thread类,且覆盖其run方法;另一种是实现Runnable接口,并将实现类对象作为参数传递给Thread类的构造方法。

1.Thread

public class MyThreadextends Thread {

public static void main(Stringargs[]){

MyThread a =  new MyThread();

a.start();

System.out.println("This is main thread");

}

public void run(){

System.out.println("This is another thread");

}

}

MyThread继承了Thread类,并覆盖了run方法。调用start方法之后,当操作系统分配时间片给这个线程后,线程启动。

2.Runnable接口

Runnable接口中的run方法是一个抽象方法,其实现类的run方法中定义的内容就是线程执行时的任务,因而实现类的run方法又称线程体。

注意:run方法无参数,并且返回类型为void。如果一个run方法有返回值或者参数,则不是线程体。

public class MyThreadimplements Runnable {

public static void main(Stringargs[]){

MyThread my =  new MyThread();

Thread a = new Thread(my);

a.start();

System.out.println("This is main thread");

}

public void run(){

System.out.println("This is another thread");

}

}

3.两种方法的比较

(1)直接继承线程Thread类:该方法编写简单,可以直接操作线程。由于已经继承Thread,不能再继承其他类了。

(2)实现Runnable接口:当一个类已经继承另一个类时,就只能实现Runnable接口的方式来创建线程。另外,使用此方法的更多原因是多个线程可共享实现类对象的资源。

public class Resourseimplements Runnable {

public int i;

public  Resourse(int _i){

i =_i;

}

public void run(){

while(true){

if(i>0){

i--;

System.out.println(Thread.currentThread().getName()+"  "+i);

}

else

break;

}

}

}

public class Test {

public static void main(String[]args){

Resourse m =new Resourse(100);

Thread a =new Thread(m);

Thread b =new Thread(m);

a.start();

b.start();

}

}

Thread-0Thread-1两个线程并发调用Resourse中的run方法,i就成了共享变量,当一个线程对i在进行自减时,另一个线程也在对i进行自减。

4.Volatile修饰符

当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。

 

 

原创粉丝点击