实现多线程的两种方式

继承Thread类,重写Thread类中的run方法

  1. public class MyThread extends Thread{
  2. @Override
  3. public void run(){
  4. super.run();
  5. System.out.println("this is myThread run");
  6. }
  7. }
  1. public static void main(String[] args) {
  2. Thread myThread=new MyThread();
  3. myThread.start();
  4. System.out.println("mian function is over");
  5. }

注意:代码的顺序并不是线程的执行顺序,start的顺序也不是多个线程的执行顺序。

实现Runable接口

java是单继承的,一个子类只能去继承一个父类,所以如果线程类已经继承了其他父类,那么就不能采用继承thread类来实现多线程了

  1. public class MyRunnable implements Runnable {
  2. @Override
  3. public void run() {
  4. System.out.println("this is myrunable running");
  5. }
  6. }
  1. public class Test {
  2. public static void main(String[] args) {
  3. Runnable myRunnable=new MyRunnable();
  4. Thread thread=new Thread(myRunnable);
  5. thread.start();
  6. System.out.println("main is runing");
  7. }
  8. }

 实例变量与线程安全

数据不共享的实例,两个线程中分别创建了两个thread实例,各种都是独立的count

  1. public class MyThread extends Thread{
  2. private int count=5;
  3. public MyThread(String name) {
  4. super();
  5. this.setName(name);
  6. }
  7. @Override
  8. public void run(){
  9. super.run();
  10. while(count>0){
  11. count--;
  12. System.out.println(this.currentThread().getName());
  13. System.out.println(count);
  14. }
  15. }
  16. }
  1. public class Test {
  2. public static void main(String[] args) {
  3. Thread thread1=new MyThread("A");
  4. Thread thread2=new MyThread("B");
  5. thread1.start();
  6. thread2.start();
  7. }
  8. }

数据共享的实例

  1. public class MyThread extends Thread {
  2. private int count = 5;
  3. @Override
  4. public void run() {
  5. super.run();
  6. count--;
  7. System.out.println(this.currentThread().getName()+count);
  8. }
  9. }
  1. public class Test {
  2. public static void main(String[] args) {
  3. Thread thread=new MyThread();
  4.  
  5. Thread thread1=new Thread(thread, "A");
  6. Thread thread2=new Thread(thread,"B");
  7. Thread thread3=new Thread(thread, "C");
  8. thread1.start();
  9. thread2.start();
  10. thread3.start();
  11. }
  12. }

可以在方法上加同步锁,syschronized,这样每一个线程在执行这个方法前需要先尝试去获取这把锁,获取不到就会等待,一直到获取到。

  1. public class MyThread extends Thread {
  2. private int count = 5;
  3. @Override
  4. synchronized public void run() {
  5. super.run();
  6. count--;
  7. System.out.println(this.currentThread().getName()+count);
  8. }
  9. }

下面是一个多线程非安全对的共享变量实例:

在实例中共享了静态变量usanameRef和passwordRef

  1. public class Alogin extends Thread{
  2. @Override
  3. public void run(){
  4. LoginServlet.doPost("a", "aa");
  5. }
  6. }
  7. public class Blogin extends Thread{
  8. @Override
  9. public void run(){
  10. LoginServlet.doPost("b", "bb");
  11. }
  12. }
  13. public class LoginServlet {
  14. private static String usenameRef;
  15. private static String passwordRef;
  16. synchronized public static void doPost(String usename,String password){
  17. try {
  18. usenameRef=usename;
  19.  
  20. if(usename.equals("a")){
  21. Thread.sleep(2000);
  22. }
  23. passwordRef=password;
  24. System.out.println("username="+usenameRef+"password="+password);
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. }
  30. public class Test {
  31. public static void main(String[] args) {
  32. Alogin alogin=new Alogin();
  33. alogin.start();
  34. Blogin blogin=new Blogin();
  35. blogin.start();
  36. }
  37. }

参考: 《java多线程编程核心技术》

https://blog.csdn.net/iaiti/article/details/53314149

java多线程编程核心技术学习-1的更多相关文章

  1. Java多线程编程核心技术---学习分享

    继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...

  2. 《java多线程编程核心技术》(一)使用多线程

    了解多线程 进程和多线程的概念和线程的优点: 提及多线程技术,不得不提及"进程"这个概念.百度百科对"进程"的解释如下: 进程(Process)是计算机中的程序 ...

  3. Java多线程编程核心技术(三)多线程通信

    线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...

  4. Java多线程编程核心技术(二)对象及变量的并发访问

    本文主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题.阅读本文应该着重掌握如下技术点: synchronized对象监视器为O ...

  5. Java多线程编程核心技术(一)Java多线程技能

    1.进程和线程 一个程序就是一个进程,而一个程序中的多个任务则被称为线程. 进程是表示资源分配的基本单位,线程是进程中执行运算的最小单位,亦是调度运行的基本单位. 举个例子: 打开你的计算机上的任务管 ...

  6. Java多线程编程核心技术---对象及变量的并发访问(二)

    数据类型String的常量池特性 在JVM中具有String常量池缓存的功能. public class Service { public static void print(String str){ ...

  7. Java多线程编程核心技术

    Java多线程编程核心技术 这本书有利于对Java多线程API的理解,但不容易从中总结规律. JDK文档 1. Thread类 部分源码: public class Thread implements ...

  8. 《Java多线程编程核心技术》推荐

    写这篇博客主要是给猿友们推荐一本书<Java多线程编程核心技术>. 之所以要推荐它,主要因为这本书写得十分通俗易懂,以实例贯穿整本书,使得原本抽象的概念,理解起来不再抽象. 只要你有一点点 ...

  9. 《Java 多线程编程核心技术》- 笔记

    作为业务开发人员,能够在工作中用到的技术其实不多.虽然平时老是说什么,多线程,并发,注入,攻击!但是在实际工作中,这些东西不见得用得上.因为,我们用的框架已经把这些事做掉了. 比如web开发,外面有大 ...

随机推荐

  1. poj1338 Ugly Numbers 打表, 递推

    题意:一个数的质因子能是2, 3, 5, 那么这个数是丑数. 思路: 打表或者递推. 打表: 若该数为丑数,那么一定能被2 或者3, 或者5 整除, 除完之后则为1. #include <ios ...

  2. IIS应用程序池"启用32位"导致服务不可用的503错误

    原来运行正常的站点,突然不正常了,出现503错误.查看操作系统的日志查看器显示: 由于配置问题,无法加载模块 DLL“C:\Program Files (x86)\IIS\Asp.Net Core M ...

  3. javase(4)_数组

    一.数组概述 数组可以看成是多个相同类型数据组合,对这些数据的统一管理. 数组变量属于引用类型,数组也可以看成对象,数组中的每个元素相当于该对象的成员变量. 数组中的元素可以是任意类型,包括基本类型和 ...

  4. 控制器生命周期方法(LifeCycle)

    1.init方法: 在init方法中实例化必要的对象(遵从LazyLoad思想) ‍init方法中初始化ViewController本身   2.loadView方法:    当view需要被展示而它 ...

  5. xhEditor编辑器上传图片到 OSS

    前段时间,公司在项目上用到了xhEditor编辑器来给用户做一个上传图片的功能当时做的时候觉得很有意思,想想 基本的用户图片上传到自己服务器,还有点小占地方: 后来....然后直接上传到阿里云 .接下 ...

  6. Linux基础学习系列目录导航

    Linux基础学习-通过VM安装RHEL7.4 Linux基础学习-命令行与图形界面切换 Linux基础学习-基本命令 Linux基础学习-RHEL7.4之YUM更换CentOS源 Linux基础学习 ...

  7. TB平台搭建之三

    有简单到复杂,可以简单的决不复杂化,事情从可控开始,即使再好的技术如果不可控最好不要用否则以后的debug可能比较麻烦. 无论是搭建平台还是写复杂的case都是尽量从简单开始,不要上来复杂,否则deb ...

  8. perl学习之进程管理

    系统函数 == 最简单的系统调用  system "date"; # Perl会将 date 命令传递给unix的shell并获取返回值和error信息等   == 带有系统参数的 ...

  9. Java的9种基本数据类型以及封装类

    Java的9种基本数据类型以及封装类 基本类型 大小(单位/字节) 默认值 封装类 byte 1 (byte)0 Byte short 2 (short)0 Short int 4 0 Integer ...

  10. windows中阿里的自动化测试macaca安装配置

    一.环境配置 node cnpm环境安装 安卓环境配置 参考文档https://macacajs.github.io/zh/environment-setup 全局安装macaca-cli macac ...