一、定义线程
1、继承java.lang.Thread类。
此类中有个run()方法,应该注意其用法:
public void run()
如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
Thread 的子类应该重写该方法。
2、实现java.lang.Runnable接口。
public void run()
使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法。
方法 run 的常规协定是,它可能执行任何所需的操作。
二、实例化线程
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)
三、启动线程
在线程的Thread对象上调用start()方法,而不是run()或者别的方法。
在调用start()方法之前:线程处于新状态中,新状态指有一个Thread对象,但还没有一个真正的线程。
在调用start()方法之后:发生了一系列复杂的事情
启动新的执行线程(具有新的调用栈);
该线程从新状态转移到可运行状态;
当该线程获得机会执行时,其目标run()方法将运行。
注意:对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。
四、例子
1、实现Runnable接口的多线程例子
-
-
-
-
-
- public class DoSomething implements Runnable {
- private String name;
-
- public DoSomething(String name) {
- this.name = name;
- }
-
- public void run() {
- for (int i = 0; i < 5; i++) {
- for (long k = 0; k < 100000000; k++) ;
- System.out.println(name + ": " + i);
- }
- }
- }
-
-
-
-
-
-
- public class TestRunnable {
- public static void main(String[] args) {
- DoSomething ds1 = new DoSomething("阿三");
- DoSomething ds2 = new DoSomething("李四");
-
- Thread t1 = new Thread(ds1);
- Thread t2 = new Thread(ds2);
-
- t1.start();
- t2.start();
- }
- }
执行结果:
李四: 0
阿三: 0
李四: 1
阿三: 1
李四: 2
李四: 3
阿三: 2
李四: 4
阿三: 3
阿三: 4
Process finished with exit code 0
2、扩展Thread类实现的多线程例子
-
-
-
-
-
- public class TestThread extends Thread{
- public TestThread(String name) {
- super(name);
- }
-
- public void run() {
- for(int i = 0;i<5;i++){
- for(long k= 0; k <100000000;k++);
- System.out.println(this.getName()+" :"+i);
- }
- }
-
- public static void main(String[] args) {
- Thread t1 = new TestThread("阿三");
- Thread t2 = new TestThread("李四");
- t1.start();
- t2.start();
- }
- }
执行结果:
阿三 :0
李四 :0
阿三 :1
李四 :1
阿三 :2
李四 :2
阿三 :3
阿三 :4
李四 :3
李四 :4
Process finished with exit code 0
对于上面的多线程程序代码来说,输出的结果是不确定的。其中的一条语句for(long k= 0; k <100000000;k++);是用来模拟一个非常耗时的操作的。
五、一些常见问题
1、线程的名字,一个运行中的线程总是有名字的,名字有两个来源,一个是虚拟机自己给的名字,一个是你自己的定的名字。在没有指定线程名字的情况下,虚拟机总会为线程指定名字,并且主线程的名字总是mian,非主线程的名字不确定。
2、线程都可以设置名字,也可以获取线程的名字,连主线程也不例外。
3、获取当前线程的对象的方法是:Thread.currentThread();
4、在上面的代码中,只能保证:每个线程都将启动,每个线程都将运行直到完成。一系列线程以某种顺序启动并不意味着将按该顺序执行。对于任何一组启动的线程来说,调度程序不能保证其执行次序,持续时间也无法保证。
5、当线程目标run()方法结束时该线程完成。
6、一旦线程启动,它就永远不能再重新启动。只有一个新的线程可以被启动,并且只能一次。一个可运行的线程或死线程可以被重新启动。
7、线程的调度是JVM的一部分,在一个CPU的机器上上,实际上一次只能运行一个线程。一次只有一个线程栈执行。JVM线程调度程序决定实际运行哪个处于可运行状态的线程。
众多可运行线程中的某一个会被选中做为当前线程。可运行线程被选择运行的顺序是没有保障的。
8、尽管通常采用队列形式,但这是没有保障的。队列形式是指当一个线程完成“一轮”时,它移到可运行队列的尾部等待,直到它最终排队到该队列的前端为止,它才能被再次选中。事实上,我们把它称为可运行池而不是一个可运行队列,目的是帮助认识线程并不都是以某种有保障的顺序排列唱呢个一个队列的事实。
9、尽管我们没有无法控制线程调度程序,但可以通过别的方式来影响线程调度的方式。
分享到:
相关推荐
13.线程的的实现方式?怎么启动线程?怎么区分线程?.avi
启动两个线程,一个线程打印1~52,另一个线程打印A~Z
通过将 MyRunnable 对象传递给 Thread 类的构造方法,我们创建了一个新的线程,并将 run 方法作为线程的执行逻辑。 除了基本的线程创建和启动,Java还提供了一些管理线程的方法和工具,例如: sleep 方法:使当前...
创建一个带三个子线程的程序,第一个线程启动10ms后,第二个线程再启动,然后再等待10ms后第三个线程启动,每一个线程从1—1000循环输出线程的名称和计数,当三个线程结束时要输出各自的结束信息,然后主线程结束。
《MFC多线程的创建,包括工作线程和用户界面线程》全面讲解MFC多线程的创建,界面多线程与工作者多线程,多线程的起源、继承与派生,两多线程之间的区别与相同点,定时器与多线程的关系与异同(定时器是定时优先抢占...
例如: for (int i = 0; i ; i++) { ...如何关闭其中的一个线程呢? 请下载解决方案。 呵呵,这个实例10分值的买, 觉得好的话就评个分吧,评分后会返回你11分 (一定要评分,光评论是不返分的)
一个简单的多线程例子,带注释。 整个过程包含创建线程,启动线程,停止线程。
多线程启动.java多线程启动.java多线程启动.java多线程启动.java
易语言多线程多次启动一个子程序源码,多线程多次启动一个子程序,循环
1. 创建一个基于对话框的应用程序。并增加如图所示控件;分别为3个进度条控件关联三个进度条类型的变量;并在对话框的初始化函数中,设定进度条的范围;为编辑框关联一个整型的变量;为12个按钮添加消息处理函数; 2...
编写程序创建Storage类的实例,并创建一个Counter对象和Printer对象操作此实例。 实验步骤: (1)、创建三个类Counter, Printer,Storage (2)、创建TestCounter类,在该类中定义main函数,在main函数中定义Storage...
易语言启动线程中的延时循环源码,启动线程中的延时循环,子程序1
创建和启动一个新线程, 在本例中09行创建了Tread对象后,Tread类的构造函数接受TreadMain的委托参数,在10行用Start()方法启动线程
一个线程可以理解为一个人,打印字母可以理解为走路 张三走一步然后李四走一步。。。所有人走完第一步后,又从张三开始走下一步。 里面一共有4中实现方式,实现线程间同步和通信问题,有synchronized实现也有...
改程序主要是测试在主线程中启动多个线程,然后每个线程启动一个进程,通过管道获取子进程的结果,然后把各个子线程的结果进行统一等待后返给主线程。
易语言的启动线程默认是传递一个整数的,要传递多个变量,思路是我们把要传递的变量定义成一个整数型数组,传递的是参数内容的内存地址指针,由于传递的参数可能是文本和整数,所以我们要封装两个取文本指针地址和...
Thread:我们可以开启一个线程。但是请大家记住:线程开启会在空间和时间上有不小的开销。所以,不能随便开。 ThreadPool:会根据你的CPU的核心数开启一个最合适的线程数量。如果你操作中,非常耗时,就不要用...
本文档 描述怎样定时 启动一个线程任务 并加了注释 希望对你有帮助
易语言类中启动线程源码,类中启动线程
JAVA 线程中启动线程,自己写的一个demo,欢迎参考