在java中,实现多线程方式有两种,继承Thread类和实现Runnable接口,准确的来说有三种,还要一种是实现Callable接口,此文不讲Callable这个。
1、继承java.lang.Thread
在创建它的对象时,它们各自执行各自的进程,互不干扰,Thread类当中的数据也是彼此独立。 如下图
运行结果:
李四运行10
张三运行10
王五运行10
王五运行9
王五运行8
王五运行7
王五运行6
王五运行5
王五运行4
王五运行3
王五运行2
王五运行1
张三运行9
李四运行9
张三运行8
李四运行8
张三运行7
李四运行7
张三运行6
李四运行6
张三运行5
李四运行5
张三运行4
李四运行4
张三运行3
李四运行3
张三运行2
李四运行2
张三运行1
李四运行1
由上面结果可以看出,多线程运行是无序的,他们各自执行各自的,互不干扰。
2、实现java.lang.Runnable
此方法需要重写Runnable接口中的run方法,在创建一个实现Runnable接口的类之后,将这个对象传给多个线程,在执行线程时,调用的是同一个Runnable实现类对象,那么Runnable实现类当中的数据,就是多个线程共享的数据。 如下图
运行结果:
李四运行9
王五运行10
李四运行7
张三运行8
李四运行5
王五运行6
李四运行3
张三运行4
李四运行1
王五运行2
由上面结果可以看出,它们也是无序的,它们一起执行同一个任务。
注:多线程共享对象会有并发问题
经过多次运行实现Runnable接口这种方式,会出现如下结果:
李四运行10
王五运行10
张三运行10
王五运行8
李四运行9
王五运行6
张三运行7
王五运行4
王五运行2
李四运行5
王五运行1
张三运行3
我们在选择有哪种方式实现多线程的时候,根据自己的需求来选择