QUESTION:线程实现的两种方式及匿名内部类实现

ANSWER:

1、多线程两种实现方式
(1)继承Thread
    * 定义类继承Thread
    * 重写run方法
    * 把新线程要做的事写在run方法中
    * 创建线程对象
    * 开启新线程, 内部会自动执行run方法

public class testThread2 {public static void main(String []args){Test t=new Test();//t.run();                    //run()方法是普通方法,要调用start()方法才会开始线程t.start();for (int i = 0; i <3000000 ; i++) {System.out.println("b");}}
}
class Test extends Thread{@Overridepublic void run() {for (int i = 0; i <3000000; i++) {System.out.println("a");}}
}

(2)实现Runnable
    * 定义类实现Runnable接口
    * 实现run方法
    * 把新线程要做的事写在run方法中
    * 创建自定义的Runnable的子类对象
    * 创建Thread对象, 传入Runnable
    * 调用start()开启新线程, 内部会自动调用Runnable的run()方法

public class testThread3 {public static void main(String []args){Test1 t=new Test1();Thread td=new Thread(t);td.start();for (int i = 0; i <3000000 ; i++) {System.out.println("b");}}
}
class Test1 implements Runnable{@Overridepublic void run() {for (int i = 0; i <300000 ; i++) {System.out.println("a");}}
}

多线程两种实现方式的区别
实现原理:
    继承Thread    :    由于子类重写了Thread类的run(), 当调用start()时, 直接找子类的run()方法
    实现Runnable:    构造函数中传入了Runnable的引用, 成员变量记住了它, start()调用run()方法时内部判断成员变量Runnable的引用是否为空, 不为空编译时看的是Runnable的run(),运行时执行的是子类的run()方法
优缺点:
    继承Thread    :
        好处:    可以直接使用Thread类中的方法,代码简单
        弊端:    如果已经有了父类,就不能用这种方法
    实现Runnable:
        好处:    即使自己定义的线程类有了父类也没关系,因为有了父类也可以实现接口,而且接口是可以多实现的
        弊端:    不能直接使用Thread中的方法需要先获取到线程对象后,才能得到Thread的方法,代码复杂

多线程的安全问题及解决方案
    问题:当多线程并发, 有多段代码同时执行时,数据会产生错乱。
    方案:我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步。

public class testThread12 {public static void main(String []args){final Print p=new Print();new Thread(){@Overridepublic void run() {while (true){p.print1();}}}.start();new Thread(){@Overridepublic void run() {while (true){p.print2();}}}.start();}
}
class  Print{test3 t=new test3();public void print1(){//synchronized (new test3())synchronized (t){               //同步代码块,锁机制,锁对象可以是任意的,不是匿名对象,因为匿名对象地址不一样System.out.print("传");System.out.print("智");System.out.print("播");System.out.print("客");System.out.print("\r\n");}}public void print2(){synchronized (t){System.out.print("用");System.out.print("心");System.out.print("创");System.out.print("造");System.out.print("\r\n");}}
}
class test3{}

死锁的产生原理
    多线程同步的时候, 如果同步代码嵌套, 使用相同锁, 就有可能出现死锁

更多关于线程的内容请查看本博主博客:

https://blog.csdn.net/yang13563758128/article/details/87261957

Java面试题:线程实现的两种方式及匿名内部类实现相关推荐

  1. Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比

    Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比 标签: AndroidAsyncTaskThreadPool异步加载view 2 ...

  2. java 深克隆_Java实现深克隆的两种方式

    序列化和依次克隆各个可变的引用类型都可以实现深克隆,但是序列化的效率并不理想 下面是两种实现深克隆的实例,并且测试类对两种方法进行了对比: 1.重写clone方法使用父类中的clone()方法实现深克 ...

  3. Java Spark之创建RDD的两种方式和操作RDD

    首先看看思维导图,我的spark是1.6.1版本,jdk是1.7版本 spark是什么?  Spark是基于内存计算的大数据并行计算框架.Spark基于内存计算,提高了在大数据环境下数据处理的实时性, ...

  4. Android通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比

    在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是 ...

  5. java的websocket_java 实现websocket的两种方式实例详解

    一.介绍 1.两种方式,一种使用tomcat的websocket实现,一种使用spring的websocket 2.tomcat的方式需要tomcat 7.x,JEE7的支持. 3.spring与we ...

  6. websocket java 例子_java 实现websocket的两种方式实例详解

    目录 一.介绍 1.两种方式,一种使用tomcat的websocket实现,一种使用spring的websocket 2.tomcat的方式需要tomcat 7.x,JEE7的支持. 3.spring ...

  7. Java中类加载器获取的两种方式

    import org.junit.Test;import java.io.FileInputStream; import java.io.IOException; import java.io.Inp ...

  8. JAVA与PLC通讯读取数据(两种方式)

    第一种方式(s7connector) S7官网:S7Connector - Documentation,有简单的读写操作参考. 1.创建maven工程引入依赖 <dependency>&l ...

  9. Java代码实现MD5加密的两种方式

    MD5的全称是Message-Digest Algorithm 5 (信息-摘要算法),在90年代初,由MIT Laboratory for Computer Scientce 和RSA Data S ...

最新文章

  1. HQL中的Like查询需要注意的地方
  2. 局部内部类访问方法中的局部变量为什么加final
  3. 学习Linux的窍门与经验
  4. networkx中求解平均度_机器学习之统计学二(分位数、平均数)
  5. 【NOI2015】软件包管理器
  6. iOS转让app-您必须移除要转让的 App 的所有构建版本和测试员,并清除“测试信息”下的所有信息字段解决方案...
  7. 安卓使用Span富文本给某段Text文本加上波浪线
  8. windows下钩子的使用
  9. Python for i in range ()用法详解
  10. SAP Spartacus master branch for 4.0 无法使用 yarn build
  11. ubuntu系统安装vscode教程
  12. oppoJava面试题,腾讯社招三面多久联系
  13. Boss黑话,老板看完都笑了!
  14. 修改oracle的表空间文件scn,分享:bbed修改数据文件头推进scn与其他数据文件相同...
  15. Mysql连接错误:Mysql Host is blocked because of many connection errors
  16. html盒子阴影效果,CSS3给div或者文字添加阴影(盒子阴影、文本阴影的使用)
  17. Specify 的含义 ------ 转载
  18. VS2012写的程序在VS2010打开时显示当前版本不兼容
  19. 解决keil注册机在win10无法打开问题
  20. python round()函数保留小数位数的详细用法及round函数的坑

热门文章

  1. mysql模糊查询与预编译_mysql预编译模糊查询恶心了我一天的时间,终于弄好了。但是还有一点不明白。如下:...
  2. oracle数据库存储ip地址,oracle – 以十进制形式存储的IP地址 – PL / SQL以虚线四边形显示...
  3. JS高级——错误处理
  4. react-router的使用(一)——URL的hash、HTML5的history、Router的基本使用
  5. 二十六、PHP框架Laravel学习笔记——模型的一对多关联
  6. LeetCode 562. 矩阵中最长的连续1线段(DP)
  7. LeetCode 1408. 数组中的字符串匹配(暴力查找)
  8. 数据结构--树状数组
  9. LeetCode 481. 神奇字符串(找规律)
  10. LeetCode 3. 无重复字符的最长子串(滑动窗口+哈希)