创建并运⾏⼀个java线程⽅法介绍
一个线程可以包含多个进程要解释线程,就必须明⽩什么是进程。
什么是进程呢?
进程是指运⾏中的应⽤程序,每个进程都有⾃⼰独⽴的地址空间(内存空间),⽐如⽤户点击桌⾯的IE浏览器,就启动了⼀个进程,操作系统就会为该进程分配独⽴的地址空间。当⽤户再次点击左⾯的IE浏览器,⼜启动了⼀个进程,操作系统将为新的进程分配新的独⽴的地址空间。⽬前操作系统都⽀持多进程。
要点:⽤户每启动⼀个进程,操作系统就会为该进程分配⼀个独⽴的内存空间。
线程--概念
在明⽩进程后,就⽐较容易理解线程的概念。
什么是线程呢?
是进程中的⼀个实体,是被系统独⽴调度和分派的基本单位,线程⾃⼰不拥有系统资源,只拥有⼀点在
运⾏中必不可少的资源,但它可与同属⼀个进程的其它线程共享进程所拥有的全部资源。⼀个线程可以创建和撤消另⼀个线程,同⼀进程中的多个线程之间可以并发执⾏。线程有就绪、阻塞和运⾏三种基本状态。
Java线程类也是⼀个object类,它的实例都继承⾃java.lang.Thread或其⼦类。可以⽤如下⽅式⽤java中创建⼀个线程:
Tread thread = new Thread();
执⾏该线程可以调⽤该线程的start()⽅法:
thread.start();
在上⾯的例⼦中,我们并没有为线程编写运⾏代码,因此调⽤该⽅法后线程就终⽌了。
编写线程运⾏时执⾏的代码有两种⽅式:⼀种是创建Thread⼦类的⼀个实例并重写run⽅法,第⼆种是创建类的时候实现Runnable接⼝。接下来我们会具体讲解这两种⽅法:
创建Thread的⼦类
创建Thread⼦类的⼀个实例并重写run⽅法,run⽅法会在调⽤start()⽅法之后被执⾏。例⼦如下:
public class MyThread extends Thread {
public void run(){
System.out.println("MyThread running");
}
}
可以⽤如下⽅式创建并运⾏上述Thread⼦类
MyThread myThread = new MyThread();
myTread.start();
⼀旦线程启动后start⽅法就会⽴即返回,⽽不会等待到run⽅法执⾏完毕才返回。就好像run⽅法是在另外⼀个cpu上执⾏⼀样。当run⽅法执⾏后,将会打印出字符串MyThread running。
你也可以如下创建⼀个Thread的匿名⼦类:
Thread thread = new Thread(){
public void run(){
System.out.println("Thread Running");
}
};
thread.start();
当新的线程的run⽅法执⾏以后,计算机将会打印出字符串”Thread Running”。
实现Runnable接⼝
第⼆种编写线程执⾏代码的⽅式是新建⼀个实现了java.lang.Runnable接⼝的类的实例,实例中的⽅法可以被线程调⽤。
下⾯给出例⼦:
public class MyRunnable implements Runnable {
public void run(){
System.out.println("MyRunnable running");
}
}
为了使线程能够执⾏run()⽅法,需要在Thread类的构造函数中传⼊ MyRunnable的实例对象。⽰例如下:
Thread thread = new Thread(new MyRunnable());
thread.start();
当线程运⾏时,它将会调⽤实现了Runnable接⼝的run⽅法。上例中将会打印出”MyRunnable running”。
同样,也可以创建⼀个实现了Runnable接⼝的匿名类,如下所⽰:
Runnable myRunnable = new Runnable(){
public void run(){
System.out.println("Runnable running");
}
}
Thread thread = new Thread(myRunnable);
thread.start();
创建⼦类还是实现Runnable接⼝?
对于这两种⽅式哪种好并没有⼀个确定的答案,它们都能满⾜要求。就我个⼈意见,我更倾向于实现Runnable接⼝这种⽅法。因为线程池可以有效的管理实现了Runnable接⼝的线程,如果线程池满了,新的线程就会排队等候执⾏,直到线程池空闲出来为⽌。⽽如果线程是通过实现Thread⼦类实现的,这将会复杂⼀些。
有时我们要同时融合实现Runnable接⼝和Thread⼦类两种⽅式。例如,实现了Thread⼦类的实例可以执⾏多个实现了Runnable接⼝的线程。⼀个典型的应⽤就是线程池。
常见错误:调⽤run()⽅法⽽⾮start()⽅法
创建并运⾏⼀个线程所犯的常见错误是调⽤线程的run()⽅法⽽⾮start()⽅法,如下所⽰:
Thread newThread = new Thread(MyRunnable());
newThread.run(); //should be start();
起初你并不会感觉到有什么不妥,因为run()⽅法的确如你所愿的被调⽤了。但是,事实上,run()⽅法并⾮是由刚创建的新线程所执⾏的,⽽是被创建新线程的当前线程所执⾏了。也就是被执⾏上⾯两⾏代码的线程所执⾏的。想要让创建的新线程执⾏run()⽅法,必须调⽤新线程的start⽅法。
线程名
当创建⼀个线程的时候,可以给线程起⼀个名字。它有助于我们区分不同的线程。例如:如果有多个线程写⼊System.out,我们就能够通过线程名容易的出是哪个线程正在输出。例⼦如下:
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable, "New Thread");
thread.start();
System.out.Name());
需要注意的是,因为MyRunnable并⾮Thread的⼦类,所以MyRunnable类并没有getName()⽅法。可以通过以下⽅式得到当前线程的引⽤:
Thread.currentThread();
因此,通过如下代码可以得到当前线程的名字:
String threadName = Thread.currentThread().getName();
线程代码举例:
这⾥是⼀个⼩⼩的例⼦。⾸先输出执⾏main()⽅法线程名字。这个线程JVM分配的。然后开启10个线程,命名为1~10。每个线程输出⾃⼰的名字后就退出。
public class ThreadExample {
public static void main(String[] args){
System.out.println(Thread.currentThread().getName());
for(int i=0; i<10; i++){
new Thread("" + i){
public void run(){
System.out.println("Thread: " + getName() + "running");
}
}.start();
}
}
}
总结
以上就是本⽂关于创建并运⾏⼀个java线程⽅法介绍的全部内容,希望对⼤家有所帮助。感兴趣的朋友可以继续参阅本站:、、等,如有不⾜之处,欢迎留⾔指出。感谢朋友们对本站的⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论