Java线程的创建与启动(1)
2017-09-11 16:56
225 查看
从Thread的构造方法,就可以看出创建一个线程的方式:
后面4个构造方法创建一个线程并加入到一个线程组中,但是创建线程的方式和前面的相似。
java中创建一个线程有两种方式:
1、继承Thread类,重写run()方法,然后直接new这个对象的实例,创建一个线程的实例。然后调用start()方法启动线程
2、实现Runnable接口,重写run()方法,然后调用new Thread(runnable)的方式创建一个线程,然后调用start()方法启动线程
其实看Thread的源文件,发现它也是实现了Runnable接口的。
[java] view
plain copy
public
4000
class Thread implements Runnable
1、继承Thread类的方式
[java] view
plain copy
public class Test1 {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
MyThread myThread=new MyThread();
myThread.start();
}
}
class MyThread extends Thread{
int i=0;
@Override
public void run() {
while (i<10) {
System.out.println(this.getName()+" i的值 "+i);
i++;
}
}
}
2、实现Runnable接口
[java] view
plain copy
public class Test1 {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
Thread thread=new Thread(new MyRunnable());
thread.start();
}
}
class MyRunnable implements Runnable{
int i=0;
@Override
public void run() {
while (i<10) {
System.out.println(Thread.currentThread().getName()+" i的值 "+i);
i++;
}
}
}
注意:
①、在继承Thread的方式中,可以使用getName()方法,来获得当前线程的名字,这是因为在Thread类中,有这个方法。可是在实现Runnable方式中,却不可以使用this.getName(),因为Runnable接口没有这个方法(可以看出来,因为我们没有提示我们需要重写这个方法),所以只能通过Thread的静态方法Thread.currentThread()取得当前的Thread对象,在调用getName()方法,来取得当前线程的名字。
②、对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。只有调用start()方法才会启动新线程。
两种方式的优缺点对比:
采用实现Runnable接口方式的多线程具有优势,一般都会使用这种方式:
1、线程类只是实现了Runnable接口,还可以继承其他类。
2、在这种方式下,可以多个线程共享一个Runnable target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好的体现了面向对象的思想。
Thread() 分配新的 Thread对象。 |
Thread(Runnable target) 分配新的 Thread对象。 |
Thread(Runnable target,String name) 分配新的 Thread对象。 |
Thread(String name) 分配新的 Thread对象。 |
Thread(ThreadGroup group,Runnable target) 分配新的 Thread对象。 |
Thread(ThreadGroup group,Runnable target,String name) 分配新的 Thread对象,以便将 target作为其运行对象,将指定的 name作为其名称,并作为 group所引用的线程组的一员。 |
Thread(ThreadGroup group,Runnable target,String name, long stackSize) 分配新的 Thread对象,以便将 target作为其运行对象,将指定的 name作为其名称,作为 group所引用的线程组的一员,并具有指定的堆栈大小。 |
Thread(ThreadGroup group,String name) 分配新的 Thread对象。 |
java中创建一个线程有两种方式:
1、继承Thread类,重写run()方法,然后直接new这个对象的实例,创建一个线程的实例。然后调用start()方法启动线程
2、实现Runnable接口,重写run()方法,然后调用new Thread(runnable)的方式创建一个线程,然后调用start()方法启动线程
其实看Thread的源文件,发现它也是实现了Runnable接口的。
[java] view
plain copy
public
4000
class Thread implements Runnable
1、继承Thread类的方式
[java] view
plain copy
public class Test1 {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
MyThread myThread=new MyThread();
myThread.start();
}
}
class MyThread extends Thread{
int i=0;
@Override
public void run() {
while (i<10) {
System.out.println(this.getName()+" i的值 "+i);
i++;
}
}
}
2、实现Runnable接口
[java] view
plain copy
public class Test1 {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
Thread thread=new Thread(new MyRunnable());
thread.start();
}
}
class MyRunnable implements Runnable{
int i=0;
@Override
public void run() {
while (i<10) {
System.out.println(Thread.currentThread().getName()+" i的值 "+i);
i++;
}
}
}
注意:
①、在继承Thread的方式中,可以使用getName()方法,来获得当前线程的名字,这是因为在Thread类中,有这个方法。可是在实现Runnable方式中,却不可以使用this.getName(),因为Runnable接口没有这个方法(可以看出来,因为我们没有提示我们需要重写这个方法),所以只能通过Thread的静态方法Thread.currentThread()取得当前的Thread对象,在调用getName()方法,来取得当前线程的名字。
②、对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。只有调用start()方法才会启动新线程。
两种方式的优缺点对比:
采用实现Runnable接口方式的多线程具有优势,一般都会使用这种方式:
1、线程类只是实现了Runnable接口,还可以继承其他类。
2、在这种方式下,可以多个线程共享一个Runnable target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好的体现了面向对象的思想。
相关文章推荐
- [疯狂Java]多线程:创建和启动线程
- Java线程:创建与启动(二)
- Java线程:创建与启动
- Java线程:创建与启动
- (一)线程的创建和启动--java 多线程编程的那点小事
- java线程创建和启动
- Java线程--创建和启动线程
- java线程的创建和启动
- Java线程创建和启动
- Java线程的创建和启动
- Java线程的创建与启动(1)
- Java线程:创建与启动
- java并发多线程,线程的创建启动
- java中的线程对象的创建,启动,运行
- Java_多线程_创建及启动线程
- java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)
- Java基础-多线程-①线程的创建和启动
- Java线程的创建与启动(1)
- Java线程:创建与启动
- Java线程:创建与启动