什么是线程

【进程与线程】

1、操作系统在执行一个程序时,会自动建立一个‘进程’,这个进程中,至少包含一个线程(这个线程被称为主线程),来作为程序入口。

2、操作系统运行中,会产生很多个‘进程’,这些进程不共享内存;而每个进程占有的内存,却可以被这个进程中不同的‘线程’所共享;另外,这些线程不仅共享这段内存,每个线程还可有一个属于它自己的内存空间——线程栈,这是线程建立时,操作系统分配的,用来保存线程数据。

3、线程总是属于某个进程,进程中的多个线程共享进程的内存。

4、进程被分为多个线程后,这些线程可以并发执行(并不是真正意义上的并发,而是线程调度造成的假象,详情参考相关操作系统教程)。


【JAVA线程】

1、由于Java是纯面向对象语言,因此,Java的线程模型也是面向对象的,Java通过Thread类将线程所必须的功能都封装了起来。

2、如果想运行自己的线程执行函数,那就要覆盖Thread类的run方法,即,继承Thread类,重写类里面的run()方法,run()里面写你要执行的代码。如下:

  1. public class MyThread extends Thread  
  2. {  
  3.       
  4.     public void run()  
  5.     {  
  6.           
  7.          //你的代码  
  8.           
  9.     }  
  10. }  

3、执行的时候,实例化MyThread,然后调用start()方法;start方法负责建立线程,调用start方法后,如果线程建立成功,会自动调用Thread类的run方法,即开始执行你的代码。如下:

  1. public static void main(String[] arg0)  
  2. {  
  3.     MyThread myThread = new MyThread();  
  4.         myThread.start();  
  5. }  

4、除了Thread类,还有一个标识某个Java类是否可作为线程类的接口Runnable,这个接口只有一个抽象方法run,也就是Java线程模型的线程执行函数。一个线程类的唯一标准就是这个类是否实现了Runnable接口的run方法,也就是说,拥有线程执行函数的类就是线程类。


5、通过继承Thread类来建立线程,虽然在实现起来更容易,但由于Java不支持多继承,如果这个线程类继承了Thread,就不能再继承其他的类了。因此,Java线程模型提供了通过实现Runnable接口的方法来建立线程,这样线程类可以在必要的时候继承和业务有关的类,而不是Thread类。

6、Runnable例子:

public class MyThread implements Runnable  
       public void run()     
     {         //your code     
      }  
    }  

  1. public static void main(String[] args) {   
  2.       
  3.     MyThread myThread1 = new MyThread();   
  4.     MyThread myThread2 = new MyThread();   
  5.   
  6.     Thread t1 = new Thread(myThread1);   
  7.     Thread t2 = new Thread(myThread2);   
  8.   
  9.     t1.start();   
  10.     t2.start();   
  11. }   


【Thread类的构造方法】

1、在使用Runnable接口时需要建立一个Thread实例,因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。Thread类的构造方法被重载了八次,构造方法如下:


  1. public Thread();  
  2. public Thread(Runnable target);  
  3. public Thread(String name);  
  4. public Thread(Runnable target, String name);  
  5. public Thread(ThreadGroup group, Runnable target);  
  6. public Thread(ThreadGroup group, String name);  
  7. public Thread(ThreadGroup group, Runnable target, String name);  
  8. public Thread(ThreadGroup group, Runnable target, String name, long stackSize);  


Runnable target

实现了Runnable接口的类的实例。要注意的是Thread类也实现了Runnable接口,因此,从Thread类继承的类的实例也可以作为target传入这个构造方法。

String name

线程的名子。这个名子可以在建立Thread实例后通过Thread类的setName方法设置。如果不设置线程的名子,线程就使用默认的线程名:Thread-NN是线程建立的顺序,是一个不重复的正整数。

ThreadGroup group

当前建立的线程所属的线程组。如果不指定线程组,所有的线程都被加到一个默认的线程组中。关于线程组的细节将在后面的章节详细讨论。

long stackSize

    线程栈的大小,这个值一般是CPU页面的整数倍。如x86的页面大小是4KB。在x86平台下,默认的线程栈大小是12KB 


2、在调用start方法前后都可以使用setName设置线程名,但在调用start方法后使用setName修改线程名,会产生不确定性。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值