Java多进程-(4)进程的创建、实施、Runnable和Thread版权声明
原创1.定义线程
在Java实现多线程有两种方式:
1、扩展java.lang.Thread类
2、实现java.lang.Runnable接口
2.实例化线程
1,如果是分机java.lang.Thread类的线程,然后直接。new即可。
2如果它实现了java.lang.Runnable类的接口,然后使用Thread施工方法:
Thread(Runnable target)
Thread(Runnable target, String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
3.启动线程
在线程的Thread对对象的调用start()方法,而不是run()或者别的什么。
在调用start()在该方法之前:线程处于新状态,新状态意味着存在一个新状态。Thread对象,但还不是真正的线程。
在调用start()方法之后:发生了一系列复杂的事情。
启动新的执行线程(使用新的调用堆栈);
线程从新状态移动到可运行状态;
当线程有机会执行时,它的目标是。run()方法将运行。
注意:对Java来说,run()这种方法没有什么特别之处。喜欢main()方法,只是新线程知道调用的方法名。(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但不会启动新的线程。
4.一些常见问题
1,线程名,一个运行的线程总是有一个名字,这个名字有两个来源,一个是虚拟机本身给出的名字,一个是你自己的名字。在没有线程名称的情况下,虚拟机始终为线程指定名称,而主线程的名称始终为mian,非主线程的名称是不确定的。
2,线程可以设置名称,也可以获取线程的名称,即使是主线程也不例外。
3获取当前线程的对象的方法如下:Thread.currentThread();
4在上面的代码中,只能保证每个线程都会启动,每个线程都会运行到完成。按某种顺序启动的一系列线程并不意味着它们将按该顺序执行。对于任何一组启动线程,调度程序无法保证其执行顺序和持续时间。
5,当线程的目标run()该线程在该方法结束时完成。
6线程一旦启动,就再也不能重新启动了。只能启动一个新线程,并且只能启动一次。可以重新启动可运行线程或死线程。
7,线程的调度是JVM部分CPU在机器上,一次只能运行一个线程。一次只执行一个线程堆栈。JVM线程调度程序确定哪个线程实际在可运行状态下运行。
许多可运行线程中的一个将被选为当前线程。不能保证选择运行可运行线程的顺序。
8,虽然通常是以队列的形式,但这并不能保证。队列形式意味着当一个线程完成一次“循环”时,它移动到可运行队列的末尾,并等待,直到它最终排队到队列的前端,然后才能再次选择它。事实上,我们称它为Runnable池而不是Runnable队列,这是为了帮助理解这样一个事实,即线程并不都以某种保证的顺序运行一个队列。
9虽然我们无法控制线程调度程序,但我们可以通过其他方式影响线程调度。
五、Runnable和Thread
Runnable是接口,Thread是类,Thread类实现了Runnable接口
这两种实施之间的区别和联系:
在程序开发中,只要是多线程的,就一定会永远实现。Runnable接口占主导地位,因为实现Runnable接口与继承的比较Thread课程有以下好处:
1避免了点继承的限制,一个类可以继承多个接口。
2,适合资源共享(例如,多个线程同时售票的问题。)
以下是票务的示例:
如果用Thread类实现:
-
public class TestThread {
-
static class SellThread extends Thread {
-
private int ticket = 10;
-
@Override
-
public void run() {
-
for (int i = 0; i < 20; i++) {
-
if (ticket > 0) {
-
System.out.println("卖票:" + ticket--);
-
}
-
}
-
}
-
}
-
public static void main(String[] args) {
-
SellThread thread0 = new SellThread();
-
SellThread thread1 = new SellThread();
-
SellThread thread2 = new SellThread();
-
thread0.start();// 每条线都卖出了10张,总共卖出了30张票
-
thread1.start();// 但实际只有10门票,每个线程都卖自己的票
-
thread2.start();// 未达到资源共享
-
}
-
}
输出如下,显然存在问题:
如果用Runnable实现:
-
public class TestRunnable {
-
static class SellRunnable implements Runnable {
-
private int ticket = 10;
-
@Override
-
public void run() {
-
for (int i = 0; i < 20; i++) {
-
synchronized (this) {
-
if (ticket > 0) {
-
System.out.println("卖票:" + ticket--);
-
}
-
}
-
}
-
}
-
}
-
public static void main(String[] args) {
-
SellRunnable runnable = new SellRunnable();
-
Thread thread0 = new Thread(runnable);
-
Thread thread1 = new Thread(runnable);
-
Thread thread2 = new Thread(runnable);
-
thread0.start();
-
thread1.start();
-
thread2.start();
-
// 虽然现在程序中有三个线程,但它们都是出售的。10张票
-
// 使用Runnable多线程可以达到资源共享的目的。
-
}
-
}
输出如下,正确:
相关引文:
http://lavasoft.blog.51cto.com/62575/27069
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除