【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第十一、十二天:多线程(创建线程1-2、多线程同步代码、实现Runnable接口、安全死锁)

------- android培训、java培训、期待与您交流! ----------  多线程概述 一个进程中至少有一个线程。 进程:是一个正在执行的程序。           ...

Java多线程——1 中断线程

一、中断线程(标识true) 线程的thread.interrupt()方法是中断线程,将会设置该线程为中断状态,即设置为true。线程中断后的结果是死亡、还是等待新的任务或是继续运行至下一步,取决于...

Java 6-1:清华池的故事——线程和线程池

1 Java的线程1.1 线程和线程池Java的线程就是Thread,一个Thread对象,就是一个线程 Runnable是一个接口,给Thread提供任务这两个就是Java里最基本的线程new T...

Java并发编程(1)——进程与线程

什么是进程 进程是程序的执行过程,在操作系统中为了进行进程的管理与调度,抽象出了进程的概念。 操作系统将进程作为资源分配和管理的基本单位。 进程的组成在操作系统中为了感知到进程,从而进行进程的调度与管...

Java 学习之路——线程1

近来学习java的线程的知识。听了听张龙老师讲的课程,感觉受益匪浅。老师的视频很给力,呵呵。   自己练习了一下线程同步的实例: package com.lcq.ThreadTest; /*...

JVM学习笔记——java内存模型与线程(1)

概述多任务处理出现的重要原因是计算机的运算速度与存储及通信子系统的速度差距太大,大量的时间花费在磁盘I/O,数据库访问或者数据库访问上。除了充分利用计算机处理器的能力外,一个服务端同时对多个客户端提供...

Java多线程设计模式详解学习笔记——Introduction1 Java语言的线程

GUI应用程序    几乎所有的GUI应用程序都会用多线程。举例来说加入现在有人在用word编辑一个比较大的文本文件刚刚才做过单字“查找”操作,当word进行查找时,屏幕上会出现“停止查找按钮”,用...

\java线程.part1

  • 2008-07-23 12:33
  • 4.77MB
  • 下载

【java并发】基础(1)--创建线程的两种方法

一、常用的两种方法创建线程的两种方法: 继承Thread类(java.lang.Thread) 实现Runnable接口(java.lang.Runnable) 1.1 继承Thread类public...

从零开始学Java之线程详解(1):原理、创建

Java线程:概念与原理 一、操作系统中线程和进程的概念 现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。 进程是指一个内存中运行的应用程序,每个进程都有自己独...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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