java创建线程
2017-05-24 16:14
204 查看
线程
线程是隶属于操作系统的概念,是程序执行中的单个顺序流程。
进程是一个执行中的程序,是操作系统对其资源(内存和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-0和Thread-1两个线程并发调用Resourse中的run方法,i就成了共享变量,当一个线程对i在进行自减时,另一个线程也在对i进行自减。
4.Volatile修饰符
当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。
线程是隶属于操作系统的概念,是程序执行中的单个顺序流程。
进程是一个执行中的程序,是操作系统对其资源(内存和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-0和Thread-1两个线程并发调用Resourse中的run方法,i就成了共享变量,当一个线程对i在进行自减时,另一个线程也在对i进行自减。
4.Volatile修饰符
当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。
相关文章推荐
- C#线程间不能调用剪切板的解决方法
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- 简单对比C#程序中的单线程与多线程设计
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- C#线程队列用法实例分析
- C++使用CriticalSection实现线程同步实例
- 基于C++实现的线程休眠代码
- VB读取线程、句柄及写入内存的API代码实例
- C#网络编程基础之进程和线程详解
- C#通过Semaphore类控制线程队列的方法
- C#多线程处理多个队列数据的方法
- C#实现线程安全的简易日志记录方法
- C#中线程同步对象的方法分析
- ASP.NET线程相关配置
- C#创建线程带参数的方法
- 浅析linux环境下一个进程最多能有多少个线程
- 详细介绍 进程、线程和协程的区别
- 再谈JavaScript线程