多线程(一)
面试题
1.谈谈你对程序、进程、线程的理解
程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。
进程(process)是程序的一次执行过程,或是正在运行的一个程序。进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域
线程(thread),进程可进一步细化为线程,是一个程序内部的一条执行路径。
2.代码完成继承 Thread 的方式创建分线程,并遍历100以内的自然数
/**
* 多线程的创建,方式一:继承于Thread类
* 1.创建一个继承于Thread类的子类
* 2.重写Thread的run()方法 ---> 将此线程的方法声明在run()中
* 3.创建Thread类的子对象
* 4.通过此对象调用start()
*
* 例子:遍历100以内的自然数
*
* 说明:高优先级的线程要抢占低优先级线程cpu的执行权。
* 但是只是从概率上讲,高优先级的线程高概率的情况下被执行。
* 并不意味着只有当高优先级的线程执行完以后,低优先级的线程才会被执行。
*
* @author alpaca
* @create 2020-06-28 9:11
*/
//1.创建一个继承于Thread类的子类
class MyThread extends Thread{
//2.重写Thread类的run()
@Override
public void run() {
for(int i=0;i<1000;i++){
System.out.println(Thread.currentThread().getName() + ":" +Thread.currentThread().getPriority()+":"+ i);
}
}
}
public class ThreadTest {
public static void main(String[] args) {
//3.创建Thread类的子对象
MyThread t1 = new MyThread();
t1.setName("线程一:");
//设置分线程的优先级
t1.setPriority(Thread.MAX_PRIORITY);
//4.通过此对象调用start():①启动当前线程 ②调用当前线程的run()
t1.start();
Thread.currentThread().setName("主线程:");
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
//如下操作仍在main线程中执行的
for(int i=0;i<500;i++){
if(i%2==0) {
//i.sout
System.out.println(Thread.currentThread().getName()
+ ":" +Thread.currentThread().getPriority()
+ ":"+i + "****main()****");
}
}
}
}
3.代码完成实现 Runnable 接口的方式创建分线程,并遍历100以内的自然数
/**
*
* 创建多线程的方式二:实现Runnable接口
* 1.创建一个实现了Runnable接口得类
* 2.实现类去实现Runnable中的抽象方法:run()
* 3.创建实现类的对象
* 4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
* 5.通过Thread类的对象调用start()
*
*
* @author alpaca
* @create 2020-06-28 11:42
*/
//1.创建一个实现了Runnable接口得类
class MThread implements Runnable{
//2.实现类去实现Runnable中的抽象方法:run()
@Override
public void run() {
for(int i = 0;i < 100;i++){
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
public class ThreadTest1 {
public static void main(String[] args) {
//3.创建实现类的对象
MThread m1 = new MThread();
//4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
//Ctrl + P 可以查看参数
Thread t1 = new Thread(m1);
//5.通过Thread类的对象调用start():①启动线程
// ②调用当前线程的run() --> 调用了Runnable类型的target的run()
t1.start();
//再启动一个线程,遍历100以内的自然数
Thread t2 = new Thread(m1);
t2.setName("线程2");
t2.start();
}
}
4.对比两种创建方式
开发中:优先选择:实现Runnable接口的方式
原因:1. 实现的方式没有类的单继承性的局限性
2. 实现的方式更适合来处理多个线程有共享数据的情况。
联系:public class Thread implements Runnable
相同点:两种方式都需要重写run(),将线程要执行的逻辑声明在run()中。
5.说说你对 IDAE 中 Project 和 Moudule 的理解
IDAE 中首先创建一个工程 (Project) ,最顶级的结构,
在工程下面可以声明一个一个的模块 (Moudule)