【java线程】——(1)线程创建

原创 2016年05月31日 15:17:58

      进程中负责程序执行的执行单元。一个进程中至少有一个线程。


      在掌握如何创建线程之前,先要了解一下什么是进程。进程(process)本质上是一个执行的程序。操作系统引入进程以后就允许计算机可以同时运行两个或两个以上的程序,这就是多任务的处理模式。每一个进程都有自己独立的一块内存空间、一组系统资源。在进程概念中,每一个进程的内部数据和状态都是完全独立的。例如,基于进程的多任务处理功能不仅可以使我们在操作系统中使用记事本编辑文档,而且还可以同时听歌和看电影。


      线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。一个进程中可以包含多个线程。



      Java中创建线程主要有三种方式:


      一、继承Thread类创建线程类

      (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。


      (2)创建Thread子类的实例,即创建了线程对象。


      (3)调用线程对象的start()方法来启动该线程。

package com.thread;  
  
public class FirstThreadTest extends Thread{  
    int i = 0;  
    //重写run方法,run方法的方法体就是现场执行体  
    public void run()  
    {  
        for(;i<100;i++){  
        System.out.println(getName()+"  "+i);  
          
        }  
    }  
    public static void main(String[] args)  
    {  
        for(int i = 0;i< 100;i++)  
        {  
            System.out.println(Thread.currentThread().getName()+"  : "+i);  
            if(i==20)  
            {  
                new FirstThreadTest().run();  
                new FirstThreadTest().run();  
            }  
        }  
    }  
  
}  

      代码中Thread.currentThread()方法返回当前正在执行的线程对象。GetName()方法返回调用该方法的线程的名字。


      二、通过Runnable接口创建线程类


      (1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。

      (2)创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

      (3)调用线程对象的start()方法来启动该线程。

package com.thread;  
  
public class RunnableThreadTest implements Runnable  
{  
  
    private int i;  
    public void run()  
    {  
        for(i = 0;i <100;i++)  
        {  
            System.out.println(Thread.currentThread().getName()+" "+i);  
        }  
    }  
    public static void main(String[] args)  
    {  
        for(int i = 0;i < 100;i++)  
        {  
            System.out.println(Thread.currentThread().getName()+" "+i);  
            if(i==20)  
            {  
                RunnableThreadTest rtt = new RunnableThreadTest();  
                new Thread(rtt,"新线程1").start();  
                new Thread(rtt,"新线程2").start();  
            }  
        }  
  
    }  
  
}  



      三、通过Callable和Future创建线程


      (1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

      (2)创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

      (3)使用FutureTask对象作为Thread对象的target创建并启动新线程。

      (4)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值


package com.thread;  
  
import java.util.concurrent.Callable;  
import java.util.concurrent.ExecutionException;  
import java.util.concurrent.FutureTask;  
  
public class CallableThreadTest implements Callable<Integer>  
{  
  
    public static void main(String[] args)  
    {  
        CallableThreadTest ctt = new CallableThreadTest();  
        FutureTask<Integer> ft = new FutureTask<>(ctt);  
        for(int i = 0;i < 100;i++)  
        {  
            System.out.println(Thread.currentThread().getName()+" 的循环变量i的值"+i);  
            if(i==20)  
            {  
                new Thread(ft,"有返回值的线程").start();  
            }  
        }  
        try  
        {  
            System.out.println("子线程的返回值:"+ft.get());  
        } catch (InterruptedException e)  
        {  
            e.printStackTrace();  
        } catch (ExecutionException e)  
        {  
            e.printStackTrace();  
        }  
  
    }  
  
    @Override  
    public Integer call() throws Exception  
    {  
        int i = 0;  
        for(;i<100;i++)  
        {  
            System.out.println(Thread.currentThread().getName()+" "+i);  
        }  
        return i;  
    }  
  
}  


      总结:

      采用实现Runnable、Callable接口的方式创见多线程时,线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。但是,如果要访问当前线程,则必须使用Thread.currentThread()方法。


      使用继承Thread类的方式创建多线程,如果需要访问当前线程,则无需使用Tread.currentThread()方法,直接使用this即可获得当前线程。但是线程已经继承了Thread类,不能再继承其它父类。

版权声明:本文为博主原创文章,未经博主允许不得转载。

【Java多线程】什么是线程与线程的生命周期与线程的创建方式

Q:什么是进程和线程? A:进程是所有线程的集合,每一个线程是进程中的一条执行路径,main也是线程,是主线程。 PS:线程之间互不干扰。 Q:为什么使用多线程? A:提高应用程序的效率,比如下载软件...
  • HTN_MK
  • HTN_MK
  • 2017年08月22日 00:19
  • 236

java源码如何创建线程

转载自:http://blog.csdn.net/jeffhtlee/article/details/12751825  Java的线程是如何创建的,是直接调用OS的API,还是有自己的“抽象线...
  • chrysanthemumcao
  • chrysanthemumcao
  • 2014年12月04日 22:02
  • 578

java线程(1)——三种创建线程的方式

1、接口实现更灵活,java不支持多继承。在这方面,Runnable和Callable更有优势。 2、返回值问题。Runnable和Thread都不能有返回值,但Callable可以,而...
  • u010066934
  • u010066934
  • 2016年04月04日 21:16
  • 1552

java中的线程创建和使用

Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口。Runnable是接口,建议用接口的方式生成线程,因为接口可以实现多继承,况且Runnable只有一个run方法,很适合...
  • liranke
  • liranke
  • 2010年03月28日 13:09
  • 7511

Java多线程之创建任务和线程

Runnable创建线程任务就是对象。为了创建任务,必须首先为任务定义一个类。任务类必须实现Runnable接口。Runnable接口非常简单,它只包含一个run方法。需要实现这个方法来告诉系统线程将...
  • yongchaocsdn
  • yongchaocsdn
  • 2016年12月14日 17:19
  • 358

Linux 线程(1)线程创建

1. 线程 2.
  • xiyanlgu
  • xiyanlgu
  • 2014年05月23日 11:42
  • 884

浅析Linux线程的创建

本文首先使用了接口pthread_create创建一个线程,并用strace命令追踪了接口pthread_create创建线程的步骤以及涉及到的系统调用,然后讨论了Linux中线程与进程关系,最后概述...
  • MaximusZhou
  • MaximusZhou
  • 2014年11月24日 19:15
  • 2258

Java创建线程的三种方式及其对比

Java中创建线程主要有三种方式: 一、继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()...
  • shenggaofei
  • shenggaofei
  • 2016年09月23日 20:54
  • 3931

linux多线程学习(二)——线程的创建和退出

      在上一篇文章中对线程进行了简单的概述,它在系统中和编程的应用中,扮演的角色是不言而喻的。学习它、掌握它、吃透它是作为一个程序员的必须作为。在接下来的讲述中,所有线程的操作都是用户级的操作。...
  • wtz1985
  • wtz1985
  • 2009年01月15日 22:07
  • 14770

c#创建线程

创建多参数的线程时,将方法要用到的参数及方法本身封装到一个类中,利用有参构造方法将参数的值传入, 因为方法在类内部,可以直接调用参数,最后用ThreadStart或ParameterizedThre...
  • a13775072234
  • a13775072234
  • 2017年02月10日 15:56
  • 267
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【java线程】——(1)线程创建
举报原因:
原因补充:

(最多只允许输入30个字)