一、多线程介绍
1).什么是多线程:是指一个程序可以有多条执行路径的能力。
我们之前的程序都是"单线程程序",从main()第一行开始,到最后一行结束。后面的代码总要等待前面的代码执行完毕,才能获得执行。
有些时候,我们需要有些代码可以和另一些代码"同时执行",这时就需要"多线程"。
2).Java是支持多线程开发的。
3).多线程的好处:提高程序的运行效率,提高用户的体验度。
二、Java多线程原理
1.调度方式
1.分时调度:多个线程都会获得相等的CPU时间。
2.抢占式调度:根据线程的优先级,优先级高的线程,会有更多的机会被执行。Java是这种模式。
2.优先级
1.Java中的线程的优先级从1–10,数字越大,优先级越高。默认优先级:5
2.在Window下Java的优先级的测试不是很明显:
1).Windows的线程优先级是7个等级,而Java是10个等级。
2).Java中线程所处理的内容很复杂,这时才能看到优先级的效果。
主线程:
之前我们的程序都是从main()方法开始,这个main()方法其实就是一个独立的线程,也是我们的主线程。我们可以通过这个主线程,产生若干多的"线程"。
三、怎么玩
实现线程的方式1_继承Thread类
1).自定义一个线程类,继承自:Thread
2).重写里面的run()方法—需要在线程中做的事情,写在这里
3).启动线程:
1).创建一个自定义线程对象;
2).调用这个对象的:start()方法启动线程;
注意:
1.对于一个线程类,可以创建多个线程对象,而且每个线程对象都可以独立的start()。
2.对于一个线程对象,不能多次的start();
3.重写是run()方法,启动线程调用的是:start();
class Thread{
public void start(){
//启动线程
run();
}
public void run(){
System.out.println(“默认实现”);
}
}
class MyThread extends Thread{
public void run(){
System.out.println(“我们自己的代码”);
}
}
main(){
MyThread t = new MyThread();
t.run();//这并不能启动线程,这只是普通的方法调用
t.start();//启动线程
}
Thread类的常用方法
1).public static void sleep(long m):让当前线程休眠m毫秒;-- 在任何类的代码中都可以使用。
2).public String getName():获取线程名称:
public void setName():设置线程名称
3).public static Thread currentThread():获取当前的线程对象。例如:在main()方法中可以使用这种方式获取当前的线程对象,并且可以设置和获取线程名称。
实现线程的方式2_实现Runnable接口
1).自定义类,实现Runnable接口;
2).实现:run()方法;
3).启动线程:
1).创建一个自定义Runnable子类的对象;
2).创建一个Thread(自定义Runnable子类对象)对象
3).调用Thread对象的start()方法启动线程。内部会自动的调用自定义对象中的run()方法。
—两种方式的对比:
1).自定义类继承Thread;
重写run()
2).实现Runnable接口,
实现run()
3).第一种方式需要继承,而Java中是单继承,子类只能继承自一个父类,所以受限制。
第二种方式实现接口,子类使用起来就比较方便,但启动线程稍微麻烦一点。
使用匿名内部类创建线程
1.new Thread(){
//重写run()
public void run(){
…
}
}.start();
相当于:自定义线程类,继承Thread的形式
2.new Thread(new Runnable(){
//实现run
public void run(){
}
}).start();
总结
本篇文章就先介绍一下线程基础知识,包括概念、原理和简单的使用方式,接下来再聊聊多线程的安全问题。