java线程综合练习
制作不易!点个关注!给大家带来更多价值!
目录
1.过Thread类创建线程
任务描述
从Thread类派生出一个子类,该子类的功能是完成指定参数阶乘的运算。
相关知识
java.lang.Thread类直接继承了Object类,并实现了Runnable接口,封装了线程对象需要的属性和方法。
通过Thread派生类创建线程的步骤是:首先创建一个Thread的派生类并重写其run方法(需要线程执行的代码就写在run方法中);然后创建该派生类的一个实例;最后在合适的地方调用该实例的start方法;子线程需要的参数可以写在派生类的成员数据中。
特别注意,是调用start方法!!!
如果在程序中调用了run方法,则该段代码一样会被执行,但是会在主线程中(即调用线程)执行,而不会在新建的子线程中执行。
本实训的根本目标就是要新建一个子线程,在新的子线程中完成指定操作。
编程要求
本关一共2个文件Main.java与MyThread.java。
其中Main.java文件不允许编辑,其内容如下
package step1;
import java.util.Scanner;
import java.lang.Thread;
public class Main{
public static void main(String[]args) {
//输入一个整数
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
//用来标记主线程开始
System.out.println("Main Thread starts.");
//MyThread是Thread的派生类,而thread是MyThread的实例
Thread thread = new MyThread(n);
//执行线程
thread.start();
//标记主线程结束
System.out.println("Main Thread ends.");
cin.close();
return;
}
}
其主要功能是输入一个整数,计算阶乘并输入。
特别的,要求阶乘的输出在主线程结束之后,也就是阶乘输出必须在"Main Thread ends."这一行之后。
通过创建一个子线程来实现这一点。子线程的实例化及执行代码已写在Main.java中。用户需要补全MyThread.java中的内容,创建一个完整的MyThread类以配合Main.java满足任务要求。
package step1;
import java.lang.Thread;
public class MyThread extends Thread {
private int num;//任务就是在子线程中计算num的阶乘
public MyThread() {
this(0);
}
//constructor,创建实例的时候初始化参数
public MyThread(int num) {
/***begin your code here***/
this.num=num;
/***end your code***/
}
@Override
public void run() {
//重写run方法,在子线程中想要执行的代码写在run方法中
int result = 1;//result保存计算出的结果
/***begin your code here***/
int i;
for (i = num; i > 0; --i)
result *= i;
/***end your code***/
//直接输出结果
System.out.println(result);
}
}
2.通过Runnable接口创建线程
任务描述
创建一个实现了Runnable接口的类,并用该类的一个实例去实例化Thread类,从而得到一个子线程,并执行它。
该子线程的主要功能是计算给定参数的阶乘并输出。
相关知识
Runnable是一个接口,任何类均可以通过implements关键字去实现该接口。具体而言就是要重写run方法。
凡是实现了Runnable接口的类,均可以看作是Runnable的一个实现。而Java的Thread类可以接受一个Runnable实现作为参数,创建出一个新的子线程实例。该子线程的具体运行代码即Runnable接口中的run方法。
编程要求
本关一共2个文件Main.java与MyRunnable.java。
其中Main.java文件不允许编辑,其内容如下
package step2;
import java.util.Scanner;
import java.lang.Thread;
public class Main{
public static void main(String[]args) {
//输入一个整数
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
//用来标记主线程开始
System.out.println("Main Thread starts.");
//MyRunnable实现了Runnable接口
MyRunnable r = new MyRunnable(n);
//使用MyRunnable的实例去实例化一个Thread
Thread thread = new Thread(r);
//执行线程
thread.start();
//标记主线程结束
System.out.println("Main Thread ends.");
cin.close();
return;
}
}
其主要功能是输入一个整数,计算阶乘并输入。
特别的,要求阶乘的输出在主线程结束之后,也就是阶乘输出必须在"Main Thread ends."这一行之后。
通过创建一个子线程来实现这一点。该子线程通过一个Runnable参数创建。创建及执行代码已在Main.java中完成。用户需要补全MyRunnable.java中的内容以配合Main.java满足任务要求。
package step2;
public class MyRunnable implements Runnable {
private int num;
public MyRunnable() {
this(0);
}