文章目录
前言
Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架和实践技巧等,分享学习心得,对自己学习过程进行整理和总结,也希望能为其他学习Java的朋友提供一些帮助和参考。
创建线程的方式之一:继承Thread类
步骤
- 创建一个继承于Thread类的子类
- 重写Thread类的run()-->将此线程要执行的操作,声明在此方法中
- 创建当前Thread的子类对象
- 通过该对象调用start()启动线程
1.2例题:创建一个分线程1,用于遍历100以内的偶数,再创建一个分线程2,用于遍历100以内的偶数
代码:
java
public class EvenNumber {
public static void main(String[] args) {
PrintNumber1 p1 = new PrintNumber1();
PrintNumber2 p2 = new PrintNumber2();
p1.start();
p2.start();
}
}
class PrintNumber1 extends Thread{
public void run(){
for (int i = 1;i<=200;i++){
if(i%2==0){
System.out.println(i);
}
}
}
}
class PrintNumber2 extends Thread{
public void run(){
for (int i = 1;i<=200;i++){
if(i%2==1){
System.out.println(i);
}
}
}
}
上述代码运行后会出现两个线程结果交替出现的效果,是多线程的体现。
除了上述创建线程的方式,现实场景中有时会需要临时创建线程,就可以使用匿名对象的方式,以下是代码示例:
java
public class Number {
public static void main(String[] args) {
//启动两个匿名线程
new Thread(){
public void run(){
for(int i = 0;i<100;i++){
if (i%2==0){
System.out.println(Thread.currentThread().getName()+"-->"+i);
}
}
}
}.start();
new Thread(){
public void run(){
for(int i = 0;i<100;i++){
if (i%2!=0){
System.out.println(Thread.currentThread().getName()+"-->"+i);
}
}
}
}.start();
}
}
注意事项
- 不能让已经start()的线程再次执行start(),否则会报异常。
创建线程的方式之二:实现Runnable接口
步骤
- 创建一个实现Runnable接口的类
- 实现接口中的run()-->将此线程要执行的操作,声明在此方法体中
- 创建当前实现类的对象
- 将此对象作为参数传递到Thread类的构造器中,创建Thread类的实例
- Thread类的实例调用start():1.启动线程2.调用当前线程的run()
代码示例,实现两个线程运行的效果:
java
class EvenNumber implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+"-->"+i);
}
}
}
public class NumberPrint {
public static void main(String[] args) {
EvenNumber e1 = new EvenNumber();
Thread t1 = new Thread(e1);
t1.start();
Thread t2 = new Thread(e1);
t2.start();
}
}
部分结果:
使用实现Runnable接口的方式:提供了Runnable接口匿名实现类的匿名对象:
java
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+"-->"+i);
}
}
}).start();
两种方式对比
- 共同点:
- 启动线程,使用的都是Thread类中定义的start();
- 创建的线程对象,都是Thread类或其子类的实例
- 不同点:一个是类的继承,一个是接口的实现。
- 建议:建议使用实现Runnable接口的方式。
Runnable方式的好处:避免的类的单继承的局限性;更适合处理有共享数据的问题;实现了代码和数据的分离。