一、多线程。

    1、进程:一个正在执行的程序叫做进程。
          每一个进程的执行都有一个执行顺序,这个顺序就是一个执行的路径,或者叫做一个控制单元。

    2、线程:就是上述进程中的一个独立控制单元, 线程在控制着进程的执行。
          一个进程至少有一个线程。

      Java virtual machine 启动时会有一个进程 Java.exe, 该进程中至少有一个进程负责Java程序的执行,
      而此进程运行的代码存在于 main方法中。
      而该线程称之为主线程。

    扩展:在更细节的说明jvm, jvm启动的时候不止主函数一个线程在进行, 还有Java垃圾回收机制的线程。

二、如何在自定义的代码中, 定义一个多线程呢?

    Java中对于线程这类事物进行了描述, 并封装成 Thread类,

  要创建一个线程有两种方法:

    创建线程的第一种方法: 就是继承至 Thread 类
                  步骤:1、定义一个类,继承Thread类。
                     2、复写类中的run方法。
                              为了定义线程要执行的代码。
                     3、new一个新的对象,创建线程。
                       4、调用其start方法,
                              该方法有两个作用:1)、启动线程 2)、调用run 方法。

                  此时main函数中的程序和 run中的程序同时进行。

          实操结果:发现每次执行的结果都不一样, 这是因为多个线程在获取cup的资源, CPU执行到那个线程,哪个线程就开始运行。
                而且每一时刻CPU中都只在运行一个进程(线程),CPU在做高速切换。 此切换具有

                所以:随机性是多线程的一个特点。

          在子程序中重写run方法的原因: 因为Thread类是为了描述一个线程, 所以该类就有一个功能: 即存储要执行的代码。
          该功能就是就是run()方法。 就是说:run()方法中的代码就是线程执行的代码(类似于main)。

          注意:只有在多线程开启语句执行了过后才会有多线程执行(start语句之后才开启多线程)。

    创建线程的第二种方法: 就是声明实现一个Runnable接口。

                  步骤:1、定义一个类,其实现了Runnable接口,
                                  class Test implements Runnable
                     2、复写该类中实现Runable而来的run方法。
                                  确定线程中应执行代码:public void run(){}
                       3、new一个该类的新对象 t。
                                  Test t = new Test();
                       4、new一个Thread 方法,并将 对象 t 当做构造实参传进去(即指定线程要执行的run方法)。
                                  Thread th = new Thread(t);
                       5、调用该Thread 对象的start方法,
                                  th.start();

          继承方式和实现方式的区别:

             实现方式: 避免了单继承带来的局限性, 在定义多线程的时候, 建议使用实现方式。
                   其线程代码存放在接口子类对象的run方法中。(只要传入Thread的对象相同,可以实现多线程共同执行同一份代码)

             继承方式:其线程代码存放在Thread子类的对象run方法中, 一个线程只能执行自己的run中的代码。

三、线程中的方法

      1、Thread 中,定义了一个name私有的String类型的变量,在new Thread对象的时候可以传入字符串名称,

                  (注:在创建子类对象的时候要复写构造函数 super())
            使用getName()方法可以拿到这个变量。

            其实线程有默认的名称: 就是Thread-编号, 该编号从 0 开始。

        static Thread currentThread():获取当前线程的对象。
        getName():获取线程的名称。 而设置线程 的名称: setName(), 或者构造函数。

四、多线程中的安全问题

    问题原因:是因为多个线程在操作同一个共享数据时(实现方法操作同一个对象, 或继承方法操作一个静态数据),其中某条线程只执行了一部分,没有执行完,
          另一个线程就进来参与执行,就发生共享数据错误。

    解决方法:在多个线程操作同一个共享数据时,同时只让一个线程对数据进行操作,该过程中,其它线程不能参与执行。

    Java对线程的安全问题提供了专业的解决工具:

        1、同步代码块:
                synchronized(对象)
                {
                    需要被同步的代码(这里就是数据代码);
                }
          这里的 对象 是任意对象,如同一个 锁,只有持有锁的线程才能同步执行数据代码;
         没有锁的进程,即使拿到了cpu 的执行权,也不能执行数据代码。(例子:火车上的卫生间--老毕例子)

          好处:必须保证同步中只能有一个线程在运行。
          弊端:降低了程序效率。

        2、非静态同步函数:

            就是将synchronized关键字放在函数的修饰符位置。

            for example: synchronized void run(){} (注:一般不能同步run方法,此处只为举例。)

          同步函数的“锁”(对象)是调用这个方法时的对象, 即:相当于 this

        3、静态同步函数:
            如果上述同步函数是被静态(static)修饰的,
            其静态“锁” 就是调用这个方法的类的字节码对象, 即: 类名.class【类型为Class】

          (因为该静态方法进内存时,没有该类的对象,但是却有该类的 字节码对象,使用该字节码对象为同步锁)

        同步的前提:1、有两个以上的线程在执行同一份代码,
              2、它们使用了同一把锁。

五、死锁

    出现原因: 同步 中 嵌套 同步,且同步的锁不一样。(避免此情况出现)。

多线程(Thread,Runnable)的更多相关文章

  1. android 多线程Thread,Runnable,Handler,AsyncTask

    先看两个链接: 1.http://www.2cto.com/kf/201404/290494.html 2. 链接1: android 的多线程实际上就是java的多线程.android的UI线程又称 ...

  2. 第39天学习打卡(多线程 Thread Runnable 初始并发问题 Callable )

    多线程详解 01线程简介 Process与Thread 程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念. 进程则是执行程序的一次执行过程,它是一个动态的概念.是系统资源分配的 ...

  3. java 多线程--- Thread Runnable Executors

    java 实现多线程的整理: Thread实现多线程的两种方式: (1)继承 Thread类,同时重载 run 方法: class PrimeThread extends Thread { long ...

  4. [java多线程] - Thread&Runnable运用

    负载是一个很大的话题,也是一个非常重要的话题.不管是在大的互联网软件中,还是在一般的小型软件,都对负载有一定的要求,负载过高会导致服务器压力过大:负载过低又比较浪费服务器资源,而且当高请求的时候还可能 ...

  5. Java多线程高并发学习笔记(一)——Thread&Runnable

    进程与线程 首先来看百度百科关于进程的介绍: 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体.它不只是程序的代码,还包括当前的 ...

  6. JAVA多线程Thread VS Runnable详解

    要求 必备知识 本文要求基本了解JAVA编程知识. 开发环境 windows 7/EditPlus 演示地址 源文件   进程与线程 进程是程序在处理机中的一次运行.一个进程既包括其所要执行的指令,也 ...

  7. 多线程-Thread、Runnable 创建线程和调用过程分析

    创建线程的两种方式: 1:创建Thread类的子类 ---基于继承的技术 . 2:以Runnable接口实例为构造参数直接通过new  创建 Thread 实例.---基于组合的技术. public ...

  8. 多线程-----Thread类与Runnable接口的区别

    第一个继承Thread类来实现多线程,其实是相当于拿出三件事即三个卖早餐10份的任务分别分给三个窗口,他们各做各的事各卖各的早餐各完成各的任务,因为MyThread继承Thread类,所以在newMy ...

  9. java中多线程中Runnable接口和Thread类介绍

    java中的线程时通过调用操作系统底层的线程来实现线程的功能的. 先看如下代码,并写出输出结果. // 请问输出结果是什么? public static void main(String[] args ...

  10. 多线程 Thread.yield 方法到底有什么用?

    概念 我们知道 start() 方法是启动线程,让线程变成就绪状态等待 CPU 调度后执行. 那 yield() 方法是干什么用的呢?来看下源码. /** * A hint to the schedu ...

随机推荐

  1. Oracle数据库设置为归档模式的操作方法

    Oracle归档模式非常非常重要!对于有些数据库刚装好后可能是非归档模式,这是很危险的!为了安全起见,一定要谨记:对于Oracle数据库,一定要设置为归档模式,尤其是生产库,只有这样才能实现数据库的有 ...

  2. kvm虚拟化管理平台WebVirtMgr部署-完整记录(3)

    继下面三篇文章完成了kvm虚拟化管理平台webvirtmgr环境的部署安装:kvm虚拟化管理平台WebVirtMgr部署-虚拟化环境安装-完整记录(0)kvm虚拟化管理平台WebVirtMgr部署-完 ...

  3. hots团队项目终审报告

    一.团队成员: 徐钧鸿: 1994年1月19日生人,摩羯座最后一天.所以有摩羯的强迫症和水瓶古怪的性格 暂且算队长吧…… 高中的时候因为兴趣学了竞赛,于是就入坑了,于是就来北航学计算机了 兴趣面很广, ...

  4. 个人作业 Last

    对M1/M2阶段的总结 M1阶段的总结反思见我以前的博客,我以前曾经写过.现附上链接.http://www.cnblogs.com/jirufeng/p/4990245.html M2阶段主要是对我们 ...

  5. JAVA常用工具类汇总

    一.功能方法目录清单: 1.getString(String sSource)的功能是判断参数是否为空,为空返回"",否则返回其值: 2.getString(int iSource ...

  6. (Alpha)Let's-版本测试报告

    测试中发现的Bug 我们在测试之前发布了新的版本Version1.1,发布新版本的同时也带来一些问题: 修复了上传图片画质问题的Bug 修复了搜索功能的部分Bug 增加了下拉刷新的功能 修复了部分界面 ...

  7. 利用ini_set()函数实现对php配置文件的修改

    PHP的配置文件是php.ini,如果要开启或者关闭扩展,还有设置一些模块的相关配置是,就得对该文件进行修改, 修改的方法也很简单,打开php.ini找到对应项直接修改,修改之后需要重新启动才能生效. ...

  8. 震旦199打印机扫描A4文件

    1.需要扫描的A4文件放入输稿器 2.使用数据线将打印机.电脑连接 3.在电脑中右键打印机,选择扫描功能 4.如下图,选择选项后,点击扫描即可

  9. ASP.NET MVC随记汇总

    1.学习教程: 1.ASP.NET MVC4入门教程:Asp.Net MVC4入门指南 2.ASP.NET MVC4系类教程 3.ASP.NET MVC学习系列 4.从零开始学习ASP.NET MVC ...

  10. PHP自动加载上——spl_autoload_register

    spl_autoload_register函数是实现自动加载未定义类功能的的重要方法,所谓的自动加载意思就是 我们的new 一个类的时候必须先include或者require的类文件,如果没有incl ...