如何创建和启动一个线程

如何解决线程的启动和停止~

线程的状态表示线程正在进行的活动以及在此时间段内所能完成的任务.线程有创建,可运行,运行中,阻塞,死亡五中状态.一个具有生命的线程,总是处于这五种状态之一:
1.创建状态
使用new运算符创建一个线程后,该线程仅仅是一个空对象,系统没有分配资源,称该线程处于创建状态(new thread)
2.可运行状态
使用start()方法启动一个线程后,系统为该线程分配了除CPU外的所需资源,使该线程处于可运行状态(Runnable)
3.运行中状态
Java运行系统通过调度选中一个Runnable的线程,使其占有CPU并转为运行中状态(Running).此时,系统真正执行线程的run()方法.
4.阻塞状态
一个正在运行的线程因某种原因不能继续运行时,进入阻塞状态(Blocked)
5.死亡状态
线程结束后是死亡状态(Dead)

创建线程和启动线程并不相同,在一个线程对新线程的Thread对象调用start()方法之前,这个新线程并没有真正开始执行。Thread对象在其线程真正启动之前就已经存在了,而且其线程退出之后仍然存在。这可以让您控制或获取关于已创建的线程的信息,即使线程还没有启动或已经完成了。

通常在构造器中通过start()启动线程并不是好主意。这样做,会把部分构造的对象暴露给新的线程。如果对象拥有一个线程,那么它应该提供一个启动该线程的start()或init()方法,而不是从构造器中启动它。

结束Java线程
Java线程会以以下三种方式之一结束:

Java线程到达其run()方法的末尾。

Java线程抛出一个未捕获到的Exception或Error。

另一个Java线程调用一个弃用的stop()方法。弃用是指这些方法仍然存在,但是您不应该在新代码中使用它们,并且应该尽量从现有代码中除去它们。

当Java程序中的所有线程都完成时,程序就退出了。

“创建100个线程”和“创建1个线程”是一样的。
(如果不一样,只可能是你问得唐突、不清晰)
你可以把100个线程放到一个数组中。
Thread threads[]=new Thread[100];
//然后逐个生成启动
for(int i=0;i<100;i++){
threads[i]=new Thread(//put some runnable here );
threads[i].start();
}

1、设计一个线程,产生三个线程对象,设置三个线程的休眠时间,10s,20s,30s。主要采用Thread类,Runable接口。

2、thread类是java.lang包中定义的,一个类只要继承Thread类,此类就是多线程操作类使用Threa类实现。

3、测试运行结果。

4、使用runnable接口实现,类中没有线程名称字段,所以建立一个name属性保存线程名称。

5、使用runnable接口,new Thread().start() 执行。



方式1:继承Thread类

步骤:

1):定义一个类A继承于Java.lang.Thread类.

2):在A类中覆盖Thread类中的run方法.

3):我们在run方法中编写需要执行的操作:run方法里的代码,线程执行体.

4):在main方法(线程)中,创建线程对象,并启动线程.

(1)创建线程类对象:                

A类   a  =  new   A类();

(2)调用线程对象的start方法:    

a.start();//启动一个线程

 

注意:千万不要调用run方法,如果调用run方法好比是对象调用方法,依然还是只有一个线程,并没有开启新的线程.

线程只能启动一次!

创建启动线程实例:

//1):定义一个类A继承于java.lang.Thread类.  
class MusicThread extends Thread{  
    //2):在A类中覆盖Thread类中的run方法.  
    public void run() {  
        //3):在run方法中编写需要执行的操作  
        for(int i = 0; i < 50; i ++){  
            System.out.println("播放音乐"+i);  
        }  
    }  
}  
  
public class ExtendsThreadDemo {  
    public static void main(String[] args) {  
          
        for(int j = 0; j < 50; j ++){  
            System.out.println("运行游戏"+j);  
            if(j == 10){  
                //4):在main方法(线程)中,创建线程对象,并启动线程.  
                MusicThread music = new MusicThread();  
                music.start();  
            }  
        }  
    }  
  
}

方式2:实现Runnable接口

步骤:

1):定义一个类A实现于java.lang.Runnable接口,注意A类不是线程类.

2):在A类中覆盖Runnable接口中的run方法.

3):我们在run方法中编写需要执行的操作:run方法里的,线程执行体.

4):在main方法(线程)中,创建线程对象,并启动线程.

     (1)创建线程类对象:

     Thread  t = new Thread(new  A());    

     (2)调用线程对象的start方法:

     t.start();

//1):定义一个类A实现于java.lang.Runnable接口,注意A类不是线程类.  
class MusicImplements implements Runnable{  
    //2):在A类中覆盖Runnable接口中的run方法.  
    public void run() {  
        //3):在run方法中编写需要执行的操作  
        for(int i = 0; i < 50; i ++){  
            System.out.println("播放音乐"+i);  
        }  
          
    }  
}  
  
public class ImplementsRunnableDemo {  
    public static void main(String[] args) {  
        for(int j = 0; j < 50; j ++){  
            System.out.println("运行游戏"+j);  
            if(j == 10){  
                //4):在main方法(线程)中,创建线程对象,并启动线程  
                MusicImplements mi = new MusicImplements();  
                Thread t = new Thread(mi);  
                t.start();  
            }  
        }  
    }  
  
}

分析继承方式和实现方式的区别:

继承方式:
                1):从设计上分析,Java中类是单继承的,如果继承了Thread了,该类就不能再有其他的直接父类了.
                2):从操作上分析,继承方式更简单,获取线程名字也简单.(操作上,更简单)
                3):从多线程共享同一个资源上分析,继承方式不能做到.
实现方式:
                1):从设计上分析,Java中类可以多实现接口,此时该类还可以继承其他类,并且还可以实现其他接口,设计更为合理.
                2):从操作上分析,实现方式稍微复杂点,获取线程名字也比较复杂,得使用Thread.currentThread()来获取当前线程的引用.

               3):从多线程共享同一个资源上分析,实现方式可以做到(是否共享同一个资源).


补充:实现方式获取线程名字:

String name = Thread.currentThread().getName();



启动一个新的线程很简单,直接调用线程类的start()方法就可以了。但是必须是线程类,就是必须实现了Runnable接口的类,当然也可以是继承Thread类因为Thread也实现了Runnable接口。

  Runnable接口有一个run()方法,java虚拟机会自己执行这个方法。你只需要重写这个方法就可以了。但是你不能自己调用这个方法,例如像这样:

Thread thread = new StartThread();
thread.run();
而是应该像这样:
Thread thread = new StartThread();
thread.start();
  你可以试一试下面的程序用thread.run();和thread.start();有什么不同。
public class StartThread extends Thread
{
@Override
public void run()
{
String name = Thread.currentThread().getName();
int i = 0;
for(i = 0;i<10;i++)
{
System.out.println(name+": "+i);
}
try
{
Thread.sleep(1000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
for( ;i<20;i++)
{
System.out.println(name+": "+i);
}
}
public static void main(String[] args)
{
Thread thread = new StartThread();
thread.start();
// thread.run();
try
{
Thread.sleep(200);
} catch (InterruptedException e)
{
e.printStackTrace();
}

String name = Thread.currentThread().getName();
for(int i = 0;i<10;i++)
{
System.out.println(name+": "+i);
}

}
}

什么是java多线程详解
答:(3)Java语言内置了多线程功能支持,简化了java多线程编程。一、创建线程和启动 (1)继承Thread类创建线程类 通过继承Thread类创建线程类的具体步骤和具体代码如下:• 定义一个继承Thread类的子类,并重写该类的run(...

创建线程的方式
答:如果线程一开始你就调用get方法阻塞住,那就和单线程没区别了。这里我的理解是:实现callable接口是比较适合去固定完成一个任务,比如计算数据,去确认一件事情之类的,这样开启一个线程去做这种事情的效率就比单线程的效率比较...

java创建线程的几种方式,了解一下
答:第一种方式:使用Runnable接口创建线程 第二种方式:直接继承Thread类创建对象 使用Runnable接口创建线程 1.可以将CPU,代码和数据分开,形成清晰的模型 2.线程体run()方法所在的类可以从其它类中继承一些有用的属性和方法 3....

c语言怎么创建线程和使用
答:1、添加线程相关的头文件:#include<pthread.h> 2、线程创建函数是pthread_create()函数,该函数的原型为:int pthread_create(pthread_t *thread,pthread_attr_t *attr,void* (*start_routine)(void*),void *arg);3...

如何创建线程?如何保证线程安全?
答:在java中如果要创建线程的话,一般有两种方式:1.继承Thread类;2.实现Runnable接口。线程安全:线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取...

java怎么实现线程
答:1、继承Thread类创建线程 Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。...

在Java 中多线程的实现方法有哪些,如何使用
答:7 Thread myThread1 = new MyThread(); // 创建一个新的线程 myThread1 此线程进入新建状态 8 Thread myThread2 = new MyThread(); // 创建一个新的线程 myThread2 此线程进入新建状态 9 myThread1.start(); // 调用star...

C++ 怎么启动线程
答:1. 创建多线程程序: 首先,先介绍一下实现多线程的具体步骤。在C++Builder中虽然用Tthread对象说明了线程的概念,但是Tthread对象本身并不完整,需要在TThread下新建其子类,并重载Execute方法来使用线程对象。在C++...

详细介绍windows系统下创建进程.线程的过程
答:3.创建初始线程(栈、堆执行环境初始化及执行线程体对象)。这时候Windows执行体进程对象已经完全建立完成,但它还没有线程所以无法执行,接下来系统调用NtCreateThread来创建一个挂起的新线程它就是进程的主线程体。4.通知...

Android里有哪些方法启动线程
答:另外一种方式其实和这个差不多啊! 那就是Runnable接口,然后把Runnable的子类对象传递给Thread类再创建Thread对象.总之都是需要创建Thread对象,然后调用Thread类的start方法启动线程。区别就是,一个是直接创建Thread对象,另外一...

IT评价网,数码产品家用电器电子设备等点评来自于网友使用感受交流,不对其内容作任何保证

联系反馈
Copyright© IT评价网