关闭

Java线程

249人阅读 评论(0) 收藏 举报
分类:

1.线程简介

世间万物都可以同时完成很多工作,例如,人体可以同时进行呼吸.血液循环。思考问题等活动,用户既可以使用计算机听歌,也可以使用它打印文件,而这些活动完全可以同时进行,这种思想放在Java中被称为并发,而将并发完成的每一件事情称为线程。

在Java中,并发机制非常重要,但并不是所有的程序语言都支持线程。在以往的程序中,多以一个任务完成后再进行下一个项目的模式进行开发。

Java语言提供了并发机制,程序员可以在程序中执行多个线程,每一个线程完成一个功能,并与其它线程并发执行,这种机制被称为多线程。

多线程是非常复杂的机制,比如同时阅读3本书,首先阅读第一本书第一章,然后再阅读第二本书第一章,再阅读第三本书第一章,回过头再阅读第一本书第二章,依此类推,就体现了多线程的复杂性。

其实Java中的多线程在Windows操作系统是多任务操作系统,它以进程为单位。一个进程是一个包含有自身地址的程序,每个独立执行的程序都称为进程,也就是正在执行的程序。系统可以分配给每个进程一段有限的使用CPU的时间(也可以称为CPU时间片),CPU在这段时间中执行某个进程,然后下一个时间片又跳至另一个进程中去执行。由于CPU转换较快,所以使得每个进程好像是同时执行一样。

一个线程则是进程中的执行流程,一个进程中可以同时包括多个线程,每个线程也可以得到一小段程序的执行时间,这样一个进程就可以具有多个并发执行的线程。在单线程中,程序代码按调用顺序依次往下执行,如果需要一个进程同时完成多段代码的操作,就需要产生多线程。


2.实现线程的两种方式

在Java中主要提供两种方式实现线程,分别为继承java.lang.Thread类与实现java.lang.Runnable接口。


(1)继承Thread类

Thread类是java.lang包中的一个类,从这个类中实例化的对象代表线程,程序员启动一个新线程需要建立Thread实例。Thread类中常用的两个构造方法如下:

public  Thread(String threadName)

public  Thread()

其中,第一个构造方法是创建一个名称为threadName的线程对象。

继承Thread类创建一个新的线程的语法如下:

public class ThreadTest extends Thread{}

完成线程真正功能的代码放在类的run()方法中,当一个类继承Thread类后,就可以在该类中覆盖run()方法,将实现该线程功能的代码写入run()方法中,然后同时调用Thread类中的start()方法执行线程,也就是调用run()方法。

Thread对象需要一个任务来执行,任务是指线程在启动时执行的工作,该工作的功能代码被写在run()方法中。run()方法必须使用一下语法格式:

public void run(){

}

注意:如果start()方法调用一个已经启动的线程,系统将抛出IllegalThreadStateException异常。


当执行一个线程程序时,就自动产生一个线程,主方法正是在这个线程上运行的。当不再启动其他线程时,该程序就为单线程程序,主方法线程启动由Java虚拟机负责,程序员负责启动自己线程

语法如下:

public static  void main(String[] args){

new ThreadTest().start();

}


下面看一个继承Thread类的实例。

在项目中创建ThreadTest类,该类继承Thread类方法创建线程。

public   class ThreadTest extends Thread{

private int count=10;

public void run(){

while(true){

System.out.print(count+" ");

if(--count==0){return;

                        }

             }

}

public static void main(String[] args){

new ThreadTest().start();

}

}


(2)实现Runnable接口

如果程序员需要继承其他类(非Theead类),而且还要使用当前类实现多线程,那么可以通过Runnable接口来实现。因为Java不支持多继承,这时该类就需要实现Runnable

接口使其具有使用线程的功能

实现Runnable接口的语法如下:

public class Thread extends Object implements Runnable

说明:实质上Thread类实现了Runnable接口,其中的run()方法正是对Runnable接口中的run()方法的具体实现

实现Runnable接口的程序会创建一个Thread对象,并将Runnable对象与Thread对象相关联。Thread类中有以下两个构造方法:

public Thread(Runnable r)。

public Thread(Runnable r,String name)。

这两个构造方法的参数中都存在Runnable实例,使用以上构造方法就可以将Runnable实例与Thread实例相关联。

使用Runnable接口启动新的线程的步骤如下:

(1)建立Runnable对象

(2)使用参数为Runnable对象的构造方法创建Thread实例

(3)调用start()方法启动线程。


下图表明了实现Runnable接口创建线程的流程:



例子如下:

public   class llx {
private int count=10;
public llx(){
Runnable b=new Runnable(){
public void run(){

while(true){

System.out.print(count+" ");

if(--count==0){return;

                        }

             }

 }
};
new Thread(b).start();
};
public static void main(String[] args){

new llx();

}

}

0
0
查看评论

如何终止java线程

终止线程的三种方法      有三种方法可以使终止线程。      1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。      ...
  • anhuidelinger
  • anhuidelinger
  • 2013-09-16 19:51
  • 160079

linux下查看Java线程

为了方便我下次查找所以写了 这个博客记录下别人的 以下是别人的链接 http://www.jiacheo.org/blog/279 https://www.zhihu.com/question/20238208
  • u013086392
  • u013086392
  • 2017-01-29 16:39
  • 3158

Java与线程

揭开java线程和操作系统线程之间的神秘面纱
  • lingdudebing
  • lingdudebing
  • 2016-03-08 03:21
  • 480

Java垃圾回收无效线程吗?

测试结果表明:线程在无效之后,GC会回收无效线程,参考附图由原先的18个线程编程12个线程 测试代码: public class ThreadTest { public static void main(String[] args) { ThreadTest threa...
  • tomli2017
  • tomli2017
  • 2017-04-16 17:18
  • 668

java四种线程的使用

Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。...
  • w_wensan
  • w_wensan
  • 2017-04-12 14:31
  • 512

Java最佳线程数

对于计算密集型任务,在拥有Ncpu个处理器的系统上,当线程池大小为N+1时,通常能实现最优的利用率,(即当计算密集型任务偶尔由于页缺失故障或者其他原因而暂停时,这个额外的现线程也能够确保CPU的时钟周期不会被浪费。)  对于包含IO操作或者其他阻塞操作的任务,由于线程并不会一直执行,...
  • cloudeagle_bupt
  • cloudeagle_bupt
  • 2017-04-05 16:26
  • 784

java线程常用方法详解

1、sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常。 例如有两个线程同时执行(没有synchronized)一个线程优先级为M...
  • nan167567
  • nan167567
  • 2016-08-01 19:57
  • 4273

Java并发编程番外篇(一)如何结束一个线程

本篇博客介绍下如何结束一个线程。在Java 的设计中,当一个线程的run方法中代码执行结束后,该线程就自动结束了。但是,在我们的实际开发过程中,可能会需要手动的结束一个线程,此时我们应该怎么安全地结束一个线程呢?1. stop方法根据Java的官方文档,Java Thread,该方法已被弃用。文档给...
  • u014088294
  • u014088294
  • 2016-08-12 08:37
  • 633

java中线程的基本操作!

java中建立线程可以有两种方式,分别是继承Thread类和实现Runnable接口. 1.继承Thread public class MyThread extends Thread{ public MyThread(String name){ super(name); } ...
  • kkkkkxiaofei
  • kkkkkxiaofei
  • 2013-10-11 16:44
  • 1867

Java多线程的常用方法(命名与取得)

一、线程的命名与取得 所有的线程程序的执行,每一次都是不同的运行结果,如果要想区分每一个线程,那么久必须依靠线程的名字。对于线程的名字一般而言会在启动之前进程定义,不建议对已经启动的线程,进行更改名称,或者为不同线程设置重名的情况 如果要进行线程名称的操作,可以使用T...
  • wangdajiao
  • wangdajiao
  • 2016-07-26 21:40
  • 5743
    个人资料
    • 访问:80913次
    • 积分:1661
    • 等级:
    • 排名:千里之外
    • 原创:79篇
    • 转载:29篇
    • 译文:0篇
    • 评论:8条
    博客专栏
    文章分类
    最新评论