转载:http://lavasoft.blog.51cto.com/62575/99150
在Java中,多线程的实现有两种方式:
扩展java.lang.Thread类
实现java.lang.Runnable接口
方式一:
public class TestMitiThread {
public static void main(String[] rags) {
System.out.println(Thread.currentThread().getName() + " 线程运行开始!");
new MitiSay("A").start();
new MitiSay("B").start();
System.out.println(Thread.currentThread().getName() + " 线程运行结束!");
}
}
class MitiSay extends Thread {
public MitiSay(String threadName) {
super(threadName);
}
public void run() {
System.out.println(getName() + " 线程运行开始!");
for (int i = 0; i < 10; i++) {
System.out.println(i + " " + getName());
try {
sleep((int) Math.random() * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(getName() + " 线程运行结束!");
}
}
运行结果:
main 线程运行开始!
main 线程运行结束!
A 线程运行开始!
0 A
1 A
B 线程运行开始!
2 A
0 B
3 A
4 A
1 B
5 A
6 A
7 A
8 A
9 A
A 线程运行结束!
2 B
3 B
4 B
5 B
6 B
7 B
8 B
9 B
B 线程运行结束!
方式二:
public class TestMitiThread1 implements Runnable {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName() + " 线程运行开始!");
TestMitiThread1 test = new TestMitiThread1();
Thread thread1 = new Thread(test);
Thread thread2 = new Thread(test);
thread1.start();
thread2.start();
System.out.println(Thread.currentThread().getName() + " 线程运行结束!");
}
public void run() {
System.out.println(Thread.currentThread().getName() + " 线程运行开始!");
for (int i = 0; i < 10; i++) {
System.out.println(i + " " + Thread.currentThread().getName());
try {
Thread.sleep((int) Math.random() * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " 线程运行结束!");
}
}
运行结果:
main 线程运行开始!
Thread-0 线程运行开始!
main 线程运行结束!
0 Thread-0
Thread-1 线程运行开始!
0 Thread-1
1 Thread-1
1 Thread-0
2 Thread-0
2 Thread-1
3 Thread-0
3 Thread-1
4 Thread-0
4 Thread-1
5 Thread-0
6 Thread-0
5 Thread-1
7 Thread-0
8 Thread-0
6 Thread-1
9 Thread-0
7 Thread-1
Thread-0 线程运行结束!
8 Thread-1
9 Thread-1
Thread-1 线程运行结束!
1、新建状态(New):新创建了一个线程对象。
2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
- 大小: 58.2 KB
分享到:
相关推荐
与此相反,像java所使用的这种并发系统会共享内存或I/O这样的资源,因此编程编写多线程程序最基本的困难在于,协调不同线程驱动的任务之间这些资源的使用,以便使得这些资源不会同时被多个任务访问。
与此相反,像java所使用的这种并发系统会共享内存或I/O这样的资源,因此编程编写多线程程序最基本的困难在于,协调不同线程驱动的任务之间这些资源的使用,以便使得这些资源不会同时被多个任务访问。
C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程...
CSharp多线程基础教程,CSharp多线程基础教程
有助于多线程的开发和理解,程序有注释便于理解,可以尝试以此为基础二次开发 学习开发属于自己的聊天室程序,学习多线程的基础。。。
MFC下的多线程编程.ppt Windows多线程编程.pdf WINDOWS核心...这些是windows下多线程编程的基础资料,可以说是入门必备资料!相当的不错!可以应付一般的多线程问题,至于比较内核的多线程和进程问题,就不要下载了!
多线程编程基础.pdf
java多线程基础资料,java多线程基础资料
Windows下多线程编程基础 Windows下多线程编程基础 Windows下多线程编程基础 Windows下多线程编程基础
多线程从基础讲起,包括线程基础、线程属性、互斥量、共享内存、条件变量。
IBM多线程编程基础教程IBM多线程编程基础教程IBM多线程编程基础教程IBM多线程编程基础教程IBM多线程编程基础教程IBM多线程编程基础教程IBM多线程编程基础教程IBM多线程编程基础教程
实用MFC多线程编程基础,原理、实例均有介绍,通俗易懂。值得看看
JAVA多线程基础DEMO,都是一些基础演练,希望可以帮到你
多线程基础理论, 多线程中常用API,多线程的实现方式, 线程池以及创建线程池相关API, 常见的设计模式等内容
多线程编程基础 windows多线程 API 全面讲解 总共101页,十分全面的讲解了多线程
多线程编程基础 多线程编程基础 多线程编程基础
MFC多线程基础解析及例子,帮助学习多线程。以后再补充
linux多线程编程基础入门.pdf
C# 多线程基础练习,需要学习多线程的小伙伴们快来下载吧
JAVA之多线程(基础图)