/* 多线程 * 创建多线程方式1:子类继承Thread * 1:创建一个子类继承于Thread * 2:重写Thread中的run()方法 将要执行的代码写在其中 * 3:创建当前子类的Thread对象, * 4:通过对象调用start()方法:启动线程,是父类中的方法 * * */ 以下演示方式1
public class ThreadTest {
public static void main(String[] args) {
//以下是在线程中执行的
number t1 = new number();
t1.start();//切勿写成 t1.run(),这个是主线程,main执行不叫多线程
// 若没有重写run方法,直接使用则无反应
//而且不能一个对象重复调用start线程
//只需new对象
// ------------------------------------------------
// number t2 = new number();
// t2.start();
//main中执行,两者出现交互体现并发多线程
Jinumber j1 = new Jinumber();//打印奇数线程
j1.start();//线程一定要在main执行上边才能发生交户
//---------------------------------匿名对象的多线程-----------------------
new Thread(){
//创建子类的匿名对象的匿名对象的多线程方法
public void run() {//打印能被3整除的数
for (int i = 1; i <= 10000; i++) {
if(i%3==0)
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}.start();//以上为匿名多线程的实现,也是多态的提现
//继承后要体现(匿名)多态性:直接new 父类(){
//如何重写方法}.在直接调用方法
for (int i = 1; i <= 10000; i++) {
if(i%2==0)
System.out.println(Thread.currentThread().getName()+i+":"+"*********");
}//Thread.currentThread().getName()获取当前执行线程名字
}
}
class number extends Thread{
@Override
public void run() {//打印偶数
for (int i = 1; i <= 10000; i++) {
if(i%2==0)
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
class Jinumber extends Thread{
@Override
public void run() {//打印奇数
for (int i = 1; i <= 10000; i++) {
if(i%2!=0)
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
/* 多线程方法二:实现Runnable接口 1:创建实现Runnable接口的类 2:实现Thread中的run()方法(抽象方法) 将要执行的代码写在其中 3:创建当前类的实现类对象 4:将此对象作为参数传递到Thread类的构造器中,创建Thread的实例 5:Thread类的实例中调用start();启动线程,调用当前线程的run() */
class number1 implements Runnable{
public void run(){
//打印偶数
for (int i = 1; i <= 10000; i++) {
if(i%2==0)
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
public class ThreadStudy1 {
public static void main(String[] args) {
number n1 = new number();
Thread t1=new Thread(n1);
t1.start();
//还需线程则进行以下操作
Thread t2=new Thread(n1);
t2.start();
//main主线程方法
for (int i = 1; i <= 10000; i++) {
if(i%2==0)
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
//方式3:匿名实现类
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 10000; i++) {
if(i%2==0)
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}).start();
}
}
//共同点:1:启动线程,都是使用Thread类中的start方法(都要创建Thread 的对象才能调用start方法)
2:创建线程的对象都是Thread类的子类或者是其子类的实例
不同点:一个是类的继承,一个接口的实现(避免单继承的局限性,并可以共享使用一个数据)