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
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除
itfan123



