JavaEE:Thread 类的基本用法

目录

一,创建线程的方法:

1.继承Thread类: 

2、实现Runnable接口

3、匿名内部类中创建Thread子类对象

4、匿名内部类中创建Runnable子类对象

5、lambda表达式创建Runnabl子类对象

二,Thread 类及常见方法

1.Thread的常见的构造方法

2.Thread 的几个常见属性

3.启动一个线程-start()

start()和run()的区别:

4.获取当前线程

5.等待一个线程-join()

6.休眠当前线程

7.线程的中断

1.定义一个标志位,作为线程结束的标志

 2.使用标准库中自带的标志位

如何查看线程信息


一,创建线程的方法:

1.继承Thread类: 

//创建一个自定义的线程类并继承标准库中的Thread类:
class MyThread extends Thread{
    @Override
    //重写父类的run方法
    public void run() {
        System.out.println("这是继承Thread类创建的线程");
    }
}
public class Thread1 {
    public static void main(String[] args) {
        //创建实例
        MyThread thread = new MyThread();
 
        //调用start方法后才会在系统上创建一个线程
        thread.start();
    }
}

重写run()方法,run是Thread父类里已经有的方法,需要重写一下,run里面的逻辑,就是这个线程要执行的工作,创建子类,并且重写run方法,相当于"安排工作"

注意:创建一个MyThread实例,创建实例,并不会在系统中真的创建一个线程!!在调用start方法时,才是真正创建出一个新的线程,新的线程就会执行run里面的逻辑,一直直到run里面的代码执行完,新的线程就运行结束了.

一个进程中至少会有一个线程,其中默认的线程就是main方法所在的线程(也叫做主线程,JVM创建的)

main主线程和MyThead创建出来的新线程是一个"并发执行"(并发+并行)的关系!!

并发执行:两边同时执行,各执行各的

2、实现Runnable接口

//实现 Runnable 接口
class MyThread2 implements Runnable{
    @Override
    public void run() {
        System.out.println("这是实现Runnable接口创建的线程");
    }
}
public class Thread2 {
    public static void main(String[] args) {
        //创建 Thread 类实例, 调用 Thread 的构造方法时将 Runnable 对象作为 target 参数.
        Runnable runnable = new MyThread2();
        //需要将Runnable实例作为Thread构造方法的参数
        Thread thread = new Thread(runnable);
        thread.start();
    }
}

 Runnable runnable = new MyThread2();
 Thread thread = new Thread(runnable);

这里我们是把线程要干的活和线程本身分开了,

使用Runnabke来专门表示"线程要完成的工作"->为了解耦合

 

3、匿名内部类中创建Thread子类对象

public class Thread3 {
    public static void main(String[] args) {
        Thread thread = new Thread(){
            @Override
            public void run() {
                System.out.println("匿名内部类创建Thread子类对象");;
            }
        };
        thread.start();
    }
}

 

4、匿名内部类中创建Runnable子类对象

public class Thread4 {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("匿名内部类创建Runnable子类对象");
            }
        });
        thread.start();
    }
}

 

 

5、lambda表达式创建Runnabl子类对象

public class Thread5 {
    public static void main(String[] args) {
        Thread thread = new Thread(()->{
            System.out.println("lambda表达式创建Runnable子类对象");
        });
        thread.start();
    }
}

 

二,Thread 类及常见方法

1.Thread的常见的构造方法

方法说明
Thread()创建线程对象
Thread(Runnable target)使用Runnable对象创建线程对象
Thread(String name)创建线程对象,并命名
Thread(Runnable target,String name)使用Runnable对象创建线程对象并命名
【了解】Thread(ThreadGroupgroup,Runnable target)线程可以被用来分组管理,分好的组即为线程组,这个目前我们了解即可

上表中第三个和第四个Thread的构造方法,可以给线程命名。我们先创建两个线程,一个是默认名,一个是自定义名:

    public static void main(String[] args) {
                    Thread thread1 = new Thread(() -> {
                        while (true) {
                            System.out.println(Thread.currentThread().getName());
                            try {
                                Thread.sleep(1100);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }, "这是一个自定义的线程");

                    Thread thread2 = new Thread(() -> {
                        while (true) {
                            System.out.println("hello world");
                            try {
                                Thread.sleep(1100);
                            } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        thread1.start();
        thread2.start();
    }

 

2.Thread 的几个常见属性

属性获取方法
IDgetId()
名称getName()
状态getState()
优先级getPriority()
是否后台线程isDaemon()
是否存活isAlive()
是否被中断isInterrupted()

 

3.启动一个线程-start()

    在创建一个线程实例后,如同我在上面说的并不会在操作系统上创建一个线程,只有当这个实例调用strat方法后,才会真正在操作系统上创建一个线程,然后该线程会去执行run方法中的代码,执行完run方法后,该线程就会被销毁

 调用 start 方法, 才真的在操作系统的底层创建出一个线程

start()和run()的区别:

 

我们可以看到start()和run()调用后的结果都是一样的但是有什么区别呢?

直接调用run并没有创建线程的,只是在原来的线程中运行的代码.

调用start,则是创建了线程,在新线程中执行代码(和原来的线程是并发的)

4.获取当前线程

通过类名调用currentThread()方法即可获取当前正在运行的线程的引用: 

可以与常见属性相搭配来使用!

5.等待一个线程-join()

方法说明
public void join()等待线程结束
public void join(long millis)等待线程结束,最多等 millis 毫秒
public void join(long millis, int nanos)同理,但可以更高精度

示例:计算一个全局变量在一个线程中自增一千万次所需要的时间:

public class CSDN {
    static int count;
    public static void main(String[] args) {
        Thread thread = new Thread(()->{
            for (int i = 0; i < 1000_0000; i++) {
                count++;
            }
        },suan);
        long beg = System.currentTimeMillis();//获取线程开始执行的时间
        thread.start();
        long end = System.currentTimeMillis();//获取线程结束执行的时间
        System.out.println("总共用时:"+(end - beg) + "ms");
    }

}

我们会发现:

此时我们的代码中有: thread main 两个线程,并且它们是并发执行的!!

当main执行wanThread.start()后,仍然会继续往后走.

意思就是当Thread开始执行时main线程同时也在执行,所以就直接计算时间的没有等到Thread执行完,所以我们需要main线程等到Thread执行完后再执行,就需要join()

 

public class CSDN {
    static int count;
    public static void main(String[] args) throws InterruptedException {
        long beg = System.currentTimeMillis();//获取线程开始执行的时间
        Thread thread = new Thread(()->{
            for (int i = 0; i < 1000_0000; i++) {
                count++;
            }
        },"T");

        thread.start();
        thread.join();

        long end = System.currentTimeMillis();//获取线程结束执行的时间
        System.out.println("总共用时:"+(end - beg) + "ms");
    }

}

 

在main中调用Thread.join()效果就是让main线程阻塞等待,直到Thread执行完毕后main再执行!

6.休眠当前线程

方法说明
sleep(long millis)休眠当前线程millis毫秒
sleep(long millis,int nanos)休眠当前线程misslis毫秒,nanos纳秒

 sleep方法也是一个静态方法,需要通过类名进行调用。作用是让当前线程休眠一段时间后再继续往后执行,调用sleep方法也需要处理InterruptedException这个异常。

示例: 让main线程休眠8秒再往后执行。

public class CSDN {
    public static void main(String[] args) throws InterruptedException {

        long beg = System.currentTimeMillis();
        Thread.sleep(8000);
        long end = System.currentTimeMillis();
        System.out.println("main线程休眠时间:"+(end-beg)+"ms");
    }
}

调用sleep方法后线程会进入阻塞状态,休眠完8000ms后线程才会恢复到就绪状态,状态之间的切换也会消耗时间,因此线程的实际休眠时间会大于参数设置的时间。

7.线程的中断

 run方法执行玩了,线程就结束了,也没有办法,让其提前一点结束呢?

通过线程中断的方法来进行的(本质上仍是让run方法尽快结束,而不是让run执行一般,强制结束)

取决与run里面的代码是如何实现的

1.定义一个标志位,作为线程结束的标志

public class CSDN {
    private static boolean isQuit = false;

    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            while (!isQuit) {
                System.out.println("hello thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("t 线程执行完了");
        });

        t.start();

        try {
            //让其三秒钟之后结束
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        isQuit = true;
        System.out.println("设置让 t 线程结束!");
    }

}

 

 2.使用标准库中自带的标志位

 

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(()->{
            while (!Thread.currentThread().isInterrupted()){
                System.out.println("hello thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("T线程结束");
        },"T");
 
        thread.start();
 
        Thread.sleep(3000);
        thread.interrupt();//设置标志位为true
        System.out.println("设置标志位让T线程提前结束");
    }

上述代码中的isInterrupted()方法是判断当前线程是否被中断,线程在正常运行时,该方法的返回值是false,即未被中断。而interrupt()方法则是将当前线程设置为中断状态,即将isInterrupted()方法的返回值设置为true。 

 从上图中可以发现,将标志位设置为True后,T线程在抛出一个异常信息后继续循环打印“hello thread”,线程并没有结束。

        因为thread在调用interrupt()方法时,T线程存在两种状态:

(1)运行状态

        此时调用interrupt()方法,可以顺利地中断进程。

(2)阻塞状态

        T线程在调用sleep()方法后就会进入阻塞状态,此时调用interrupt()方法,不会设置标志位为True,而是会把T线程从阻塞状态提前唤醒,抛出InterruptedException异常。

        所以我们要想中断进程,只需要在抛出异常时加一个break即可:

 

在Java中,中断线程并不一定是强制执行的,而是由线程自身进行判定处理(取决于代码是如何实现的),一般有三种处理方式:

(1)立即结束:直接break

(2)不予理会:不作处理,继续执行run方法的代码

(3)稍后结束:休眠一段时间再break

 

public class CSDN {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            
            while (!Thread.currentThread().isInterrupted()) {
                System.out.println("hello thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // e.printStackTrace();

                    // [方式一] 立即结束线程
                    break;

                    // [方式二] 啥都不做, 不做理会. 线程继续执行

                    // [方式三] 线程稍后处理
                    // Thread.sleep(1000);
                    // break;
                }
            }
            System.out.println("t 线程执行完了");
        });

        t.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        t.interrupt();
        System.out.println("设置让 t 线程结束!");
    }


}

 

如何查看线程信息

 打开jconsole后,选择本地进程,找到正在运行的线程所在的类,点击连接:

咱们自己看看自己写的不打紧,可以无视风险(滑稽)

 

豆腐乾净找方规
关注 关注
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JavaEEThread 及常用方法
保护小周ღ的博客
03-20 1954
哈喽,大家好~我是保护小周ღ,本期为大家带来的是 Java 多线程的 Thread ,讲述了 Thread 的常用方法及常用属性,例如:线程的 name, 如何启动线程,终止线程,等待线程…… 更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘
JavaEE:Sentinel使用
a526001650a的专栏
03-01 895
说明: Sentinel是控制组件,可实现流量控制、熔断降级、系统自适应保护等多个维度保护微服务的稳定性。 一、启动Sentinel控制台Dashboard: 1.非生产环境搭建Dashboard: (1)下载sentinel-dashboard-1.8.3.jar到D盘根目录: https://github.com/alibaba/Sentinel/releases (2)打开cmd启动控制台(设置用户和密码都为root): D:\>java -Dserver.port=8080 -
JavaEE——Thread详解
lzhNox的博客
07-23 343
Thread详解
线程的概念和创建【javaee初阶】
kim的博客
11-28 591
注意:在谈到多进程的时候,会经常谈到 "父进程" 和 "子进程",如果在 A进程 里面创建了 B进程,那么A 是 B 的父进程,B 是 A 的子进程。红色框里面的内容,创建了一个匿名内部(没有名字),这个匿名内部Thread 的子,同时前面的 new 关键字,就会给这个匿名内部创建出了一个实例。当然,此时是看不到 Java线程的,需要借助其他的工具。虽然 可以在这里运行了许多次,先打印出来的是"hello main",但是顺序仍然是不可确定的,大概率是受到了创建线程自身的开销影响的~
用lambda表达式实现Runnable
热门推荐
duan_2018的博客
03-15 3万+
// Java 8之前: new Thread(new Runnable() { @Override public void run() { System.out.println("Before Java8"); } }).start();new Thread( () -&gt; System.out.println("In Java8, Lambda expres...
Thread和Runnable创建多线程的方式的区别
07-25 513
线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。同一进程中的多条线程将共享该进程中的全部系统资源。 源码浅析 Runnable源码 Runnable是个空接口,只有一个抽象方法run(); @FunctionalInterface publ...
java8新特性:lambda表达式,使用lambda表达式实现Runnable接口
weixin_44673447的博客
03-24 3494
java8新特性:lambda表达式,使用lambda表达式实现Runnable接口 1.使用lambda表达式实现interface接口 1.1、当一个接口只有一个方法时,可以使用lambda表达式实现这个接口。 1.2、当方法中只有一条语句时,可以不写大括号 1.3、方法中超过一条语句时,需要写大括号 interface Animal{ void play(); } Animal animal = ()->{System.out.print("hello");}//当一个接口只有一个方法时,可以
JavaEE:代码简单优化
a526001650a的专栏
04-02 853
一、使用对象池: 说明: 复用对象,降低频繁创建/回收对象的性能损耗。1.自定义简单对象池: public class ObjectPool<T> {//自定义简单对象池 private static ObjectPool mInstance; private final int Default_SIZE = 100; private int mMaxSize = Default_SIZE; //对象最大个数 private static final Str...
JavaEEJVM监控/故障排查工具使用
a526001650a的专栏
03-28 672
一、监控工具: 1.jps: (1)格式: jps -命令 IP或域名 #默认使用rmi格式,rmi协议默认端口1099 jps -命令 协议名://IP或域名:端口 (2)命令列表(可以多个参数联用): q:查看进程ID m:查看传给main的参数 l:查看应用main class全名 v:查看传给jvm的参数 V:隐藏传给jvm的参数 (3)使用: jps -q rmi://192.168.233.130:8080 2.jstat: (1)格式([...
JavaEEJVM优化
a526001650a的专栏
04-01 799
一、选项参数: 1.标准选项参数: (1)查看支持的标准选项参数: java -help (2)标准选项参数列表: -cp <目录和 zip/jar 文件的搜索路径> -classpath <目录和 zip/jar 文件的搜索路径> --class-path <目录和 zip/jar 文件的搜索路径> 使用 ; 分隔的, 用于搜索文件的目录, JAR 档案 和 ZIP 档案列表。 -p <...
如何创建线程
qq_60202930的博客
06-29 941
目录一:认识线程二:如何构造线程1:继承Thread,重写run方法2:实现runnable接口,重写run方法3:使用lambda表达式创建runnable子对象4匿名内部方法说到线程,我们就不得不提进程。较为官方的定义,进程是系统分配资源的最小单位,这个资源可以是cpu、内存等等。线程是系统调度的最小单位。并且同一个进程下的各个线程之间是可以相互共享资源的。具体来说,举个例子,我们平时中午家里妈妈出去买菜,那么买菜就可以算是一个进程,紧接着妈妈让我们去卖鱼,她去买肉,那么这里的卖鱼和卖肉分别是买菜
java匿名内部runnable_java匿名内部用法总结实例源码
weixin_36422707的博客
02-24 355
java匿名内部用法总结实例源码。当需要extends一个,或implements一个接口的时候,可以直接new一个这个或接口的对象出来,然后在后面加{},里面写你准备写在子里面的所有东西。这样,new出来的这个对象就拥有了这个{}里面的所有东西。举个例子说,假如你需要写class A1 extends A{public void fun(){System.out.println(“A1-...
Java 并发
s6664的博客
09-17 185
CAS: 全称Compare and swap,字面意思:”比较并交换1. 比较 A 与 V 是否相等。(比较)2. 如果比较相等,将 B 写入 V。(交换)3. 返回操作是否成功。}}上面写的代码不是原子的, 真实的 CAS 是一个原子的硬件指令完成的。
多线程笔记 | 通过匿名创建 Runnable 线程
码农UP2U
01-08 720
书上说,执行一次性的线程,可以使用匿名的 Runnable 实例,但是,不知何时使用一次性的线程呢? public class CreateDemo2New { public static final int MAX_TURN = 5; static int threadNo = 1; public static void main(String[] args) { Thread thread = null; // 使...
java之线程创建的两种方式,六种状态和匿名内部创建子或实现对象
KongLingLei_08225的博客
09-18 519
一.匿名内部创建子或实现对象 new Test(){} 相当于创建了Test的子对象 并且没有名 创建接口实现 new 接口名() {};接口实现的对象 注意 : new 后边是或者接口名 大括号内是或者接口中的方法 public class Kll { public static void main(String[] args) { Test test = n...
Java EE规范
skysukai的博客
10-16 751
Java EE的全称是Java Platform, Enterprise Edition。早期Java EE也被称为J2EE,即Java 2 Platform Enterprise Edition的缩写。从J2EE1.5以后,就改名成为Java EE。一般来说,企业级应用具备这些特征:1、数据量特别大;2、用户特别多;3、性能要求高;4、安全性要求高;5、生命周期长。企业级应用就要考虑数据存储和查询的问题、系统訪问快慢即性能问题、怎样使用事务保证安全的问题、怎样使系统可扩展易维护的问题。
No provider available from registry RegistryDirectory
最新发布
小道仙的后宫
10-20 398
最近在做配置文件升级,服务比较多,之前的Dubbo配置各个服务写的比较乱,有的用Nacos上的 data-id,有的又是在自己的服务引入配置遂准备统一了,全部都用Nacos上的配置,同时修改了Dubbo服务名发到线上的时候,线上崩了,部分服务出现如下错误注: IP和服务名做了隐藏处理。
【C++刷题】力扣-#121-买卖股票的最佳时机
会写代码的饭桶
10-16 650
给定一个数组 prices,其中 prices[i] 表示第 i 天的股票价格。假设你可以在第 i 天买入并在第 j 天卖出股票(i ≤ j),设计一个算法来计算你所能获取的最大利润。注意你只能持有一股股票,并且你不能同时参与多笔交易(即在再次买入前必须卖出股票)。
java 异常包装
fdvvg的博客
10-17 397
通过异常包装,可以在Java中有效地处理和传递异常。这样做不仅能保持原始异常的信息,还能为上层调用者提供更多的上下文信息。
Java程序设计:Thread实现多线程详解
"这篇资料主要介绍了如何在Java中使用Thread来启动多线程,并给出了一个简单的示例。此外,还涵盖了Java程序设计的学习概述、核心知识点、学习方法以及Java软件工程师所需掌握的技术体系。" 在Java程序设计中,多...
写文章

热门文章

  • 扫雷(详细版)保姆级 6831
  • 三子棋(详细)千字讲解,望支持 5988
  • 猜数字游戏 3308
  • Spring(五大类注解,对象的三种注入方式及其优缺点) 2600
  • MyBatis查询数据库之四(动态SQL -- if、trim、where、set、foreach 标签) 2577

最新评论

  • 网络初识之【IP+端口号+网络协议+OSI+TCP/IP+封装和复用】

    黑夢: 大佬的文章让我对这领域的技术问题有了更深入的了解,尤其是大佬提到的那些“坑点”,我相信能够在实际应用中避免或解决很多问题。谢谢大佬的分享,期待大佬的更多精彩文章,让我们共同学习、进步。

  • 网络初识之【IP+端口号+网络协议+OSI+TCP/IP+封装和复用】

    程序猿进阶: 网络协议的作用是啥?

  • 详解自动化之单元测试工具Junit

    2301_77704139: 好棒,真的救命了。太爱了,谢谢您!

  • 详解自动化之单元测试工具Junit

    呼啦啦啦啦啦啦啦啦: 优质好文,博主的文章细节很到位,兼顾实用性和可操作性,感谢博主的分享,文章思路清晰,图文并茂,详略得当,三连支持,期待博主持续输出好文!

  • 详解自动化之单元测试工具Junit

    黑夢: 文章写的很详细,条理清晰,很容易看进去,学到了很多知识,感谢博主分享,支持博主

最新文章

  • 网络初识之【IP+端口号+网络协议+OSI+TCP/IP+封装和复用】
  • 详解自动化之单元测试工具Junit
  • 详解自动化测试之 Selenium
2023年30篇
2022年31篇
2021年3篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆腐乾净找方规

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家阜阳人物玻璃钢雕塑联系方式揭阳玻璃钢雕塑定做湖南商城艺术玻璃钢雕塑工厂江苏户外玻璃钢雕塑优势成都商场美陈费用山西佛像玻璃钢雕塑供应商天津玻璃钢雕塑设计商顺义区靠谱的商场美陈洛阳玻璃钢卡通雕塑制作郑州室内玻璃钢仿铜雕塑设计南宁玻璃钢雕塑市场璧山玻璃钢雕塑甘肃彩色玻璃钢雕塑制作石家庄农耕文化玻璃钢人物雕塑顾客被商场美陈绊倒骨折高架玻璃钢花盆价格绵阳小区玻璃钢雕塑公司天津商场主题创意商业美陈作品云南个性化玻璃钢雕塑定制鹰潭玻璃钢雕塑制作宁波玻璃钢卡通雕塑报价阳西玻璃钢花盆花器金华玻璃钢仿铜雕塑定制供应商场专柜美陈图片大全银川玻璃钢雕塑安装宿州小区玻璃钢雕塑公司上海灰色玻璃钢花盆寻甸玻璃钢雕塑信阳不锈钢人物玻璃钢卡通雕塑乐山玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化