(二)多线程说学逗唱:新手村偶遇Thread类

  • 在上文中我们大致上了解了下进程和线程的概念和他们之间的关系,也说到了多线程是一名程序员必须掌握的必备技能,那么在java编程的过程中如何使用多线程技术呢??其实是很简单的,有一点计算机常识的玩家都知道,一个进程正在进行时至少会有一个线程在运行,那么执行一个进程时多个线程共同工作就是我们想要的。
  • 我们举个例子,本人在工作中就遇到过相关的业务,因为刚入职场,项目老大就给与我一个导入表格中客户数据的需求,作为小白的我必然是使用相关技术将表格中的数据一行一行读取出来,然后一行一行地处理后存入到数据库中…当我完成了查询和插入操作之后我就发现了一个问题,这个问题比我是否能够实现这个功能还要大,那就是我创造了BUG,我的天,新手村遇BUG,你说难受不难受。这个问题就是,当我点击导入的时候,应用的界面一直停留在导入框界面不动,是什么原因?原来是应用请求接口的时候我后端代码就去执行上面的查和存的操作了,而接口就一直在等待后端返回其接口处理结果,数据量小还好,数据量一旦大起来,怕是等到猴年马月都不会有结果,就像各位看官追求心仪的女神,迟迟不得的那种情景…这种情况解决起来就需要用到多线程技术了,处理方法就是让接口返回和数据处理交给不同的线程执行,在发起导入的请求之后,一个线程直接返回接口正在导入这样一个结果,另外给若干个线程让其去执行解析表格中数据的操作,既提高了效率又节约了时间,真是居家旅行、升级打怪必备良品。
那么我们就开始学习创建多线程的方式之一:继承Thread类和关于Thread的相关细节
  • Thread类是java.lang包下常使用到的一个类,实现了Runnable接口,构造方法众多。
    在这里插入图片描述
  • 接下来我就将展示一个简单的创建一个多线程的实例,在示例中我会创建一个类,继承Thread方法,然后类中重写run方法…
package day01;
/**
 * 
* @ClassName: UseThread
* @Description: 学习多线程环境下CPU调用的随机性,执行start方法的顺序不代表线程启动的顺序
* @author Jian.Wang
* @date 2018年12月6日
*
 */
public class UseThread {

	public static void main(String[] args) {
		try {
			MyThread myThread = new MyThread();
			myThread.setName("myThread");
			myThread.start();
			for (int i = 0; i < 10 ; i++) {
				int time = (int)(Math.random()*1000);
				Thread.sleep(time);
				System.out.println("main=" + Thread.currentThread().getName());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
/**
 * 
* @ClassName: MyThread
* @Description: 自定义线程类,继承Thread类并且重写了run方法
* @author Jian.Wang
* @date 2018年12月6日
*
 */
class MyThread extends Thread {
	@Override
	public void run() {
		try {
			for(int i = 0 ; i < 10 ; i++) {
				int time = (int)(Math.random()* 1000);
				Thread.sleep(time);	
				System.out.println("run="+Thread.currentThread().getName());
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
}

  • 以上代码中一共包含两个类,为了方便我没有写到分别的文件中而是放在了一起,方便观察。MyThread继承了Thread类,重写了run方法,在run方法中调用了随机函数获取到了一个1000以内的时间,作为线程睡眠的时间(sleep(time) 线程等待时间函数),然后就输出了线程的名称(名称也是可以设置的,后面再说)。
  • UseThread类作为执行类,创建了线程类的实体,使用了setName(String name)方法为线程起了一个自定义的名字,随后myThread实体调用start()方法启动线程。先不看后面的for循环,这样其实就是创建了一个多线程的程序,执行start后程序就开启一个新的线程去执行run方法中的代码。
  • 我们在详细地看,start方法调用后有个for循环,里面是随机事件和线程睡眠的执行并输出线程的名字,为什么这里要这样做呢??这里其实是为了想要表达:多线程环境下CPU调用的随机性,执行start方法的顺序不代表线程启动的顺序,其实在启动程序之后,执行这些代码一共产生了两个线程,一个是主线程(main),一个是用户开启并命名为myThread的线程,也就是说这两条线程是相互占用CPU资源去执行自己要做的事情,代码中加上线程等待时间就是为了更加直观地展示,某一个线程正在睡眠,资源必然被其他线程使用,我们来看下程序运行的结果…
    在这里插入图片描述
  • 看到输出结果,刚接触线程的玩家可能会觉得难以理解,不是说调用start方法后线程就开启了吗,按理说应该执行在前才对,这是一种不正确的思维的,代码前后程序执行的表现,前面也说到程序中还有名为main的线程,它从一开始就和你自己创建的线程争抢CPU资源,一启动程序main线程就开始执行了,后来因为睡眠,就交出了执行权借而自定义线程进行执行run方法中的代码,待到myThread线程睡眠,又将执行权交给main执行,这就造成了图中的运行结果。

猜你喜欢

转载自blog.csdn.net/WJHelloWorld/article/details/84870402