在讲解多线程前,我们必须理解什么是多线程?而且很多人都会将进程和线程做对比。

进程和线程

进程:进程是操作系统结构的基础,是一次程序的执行,是一个程序及其数据在处理机上顺序执行时所发生的活动,是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。或者这样理解,进程是一块包含了某些资源的内存区域。操作系统利用进程把它的工作划分为一些功能单元。

那么进程和程序有什么关系呢?简单的说,一个程序至少有一个进程。

线程:是进程中某个单一顺序的控制流。也被称为轻量进程。程序执行流的最小单位。在一个程序中,这些独立运行的程序片段就叫做”线程”(Thread)。或者这样理解,线程是进程中所包含的一个或多个执行单元。进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问。

进程和线程的关系:

(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。

(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。

(3)处理机分给线程,即真正在处理机上运行的是线程。

(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

多线程:就是同时有多个线程执行,共同维护程序中的数据。(个人理解)

多线程实现

那么,在Java中如何实现多线程呢??

解析:在Java中,实现多线程有两种方式。

方式一:用户自定义一个类,继承自Thread类,重写该类的run方法

方式二:用户自定义一个类,实现Runnable接口,并且重写接口的run方法

方式一用法:

案例:我们在main方法中写一个for循环,循环1000次。并且开启一个子线程。也循环1000次。

代码如下:

 public class MyThread {

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

 //设置并开启多线程

 MyThreadTest thread=new MyThreadTest();

         thread.start();

        for (int i = 1; i <=1000; i++) {

          System.out.println("我是心如止水的主线程的第"+i+"次输出");

       }

 }

 }

 //俺们自己写的类:继承自Thread类

 class MyThreadTest extends Thread{

    public void run(){

        for (int i = 1; i <=1000; i++) {

          System.out.println("我是害羞的子线程A的"+i+"次输出");

       }

    }

 }

方式二用法:

 public class MyThread {

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

     //设置并开启多线程

     MyThreadTestiI mi=new MyThreadTestiI();

     Thread thread=new  Thread(mi);

     thread.start();

     for (int i = 1; i <=1000; i++) {

         System.out.println("我是心如止水的主线程的第"+i+"次输出");

     }

 }

 }

 //俺们自己写的类:实现了Runnable接口

 class MyThreadTestiI implements Runnable{

       public void run(){

          for (int i = 1; i <=1000; i++) {

             System.out.println("我是害羞的子线程A的"+i+"次输出");

         }

      }

 }

线程休眠

在程序的执行过程中,如何让程序中某个线程暂停一段时间呢?

案例:写一个小程序,在子线程中,每循环一次,就让该线程休眠1s。

Main方法中代码如下:

 //线程休眠

         System.out.println("程序开始");

         new Thread(){

              public void run(){

                   for (int i = 1; i <=10; i++) {

                       //每循环一次,让程序休眠1s

                           try {

                              //这里, 必须用try,catch包裹,否则编译无法通过

                             //当然这里也不支持在方法上声明 throws Exception

                            //因为当前执行的run方法是子类的,根据异常的知识我们知道

                            //子类的方法的异常声明必须是父类方法异常声明的子集。但是

                           //我们通过查看代码可知run方法是没有进行异常声明的,所以

                           //这里只能采取try catch的方式。

                           //02。另外这里直接用的sleep,而不是 Thread.

                          //currentThread().sleep(millis),原因是

                          //sleep()方法属的类是Thread类的子类,由于Thread

                         //类中有sleep方法,所以在子类中可以直接使用sleep方法。

                          sleep(1000);

                         } catch (InterruptedException e) {

                              e.printStackTrace();

                          }

                      System.out.println("第"+i+"次循环");

               }

          }

         }.start();

守护线程:

 //第一个线程

      Thread t1=new Thread(){

            public void run(){

                 for (int i = 1; i <=3; i++) {

                      System.out.println("我是第一个线程第"+i+"次循环");

                       try {

                          Thread.sleep(1000);

                       } catch (InterruptedException e) {

17                           e.printStackTrace();

                       }

21                }

            }

      };

       //第二个线程

      Thread t2= new Thread(){

           public void run(){

                 for (int i = 1; i <=23; i++) {

                      System.out.println("我是第 2 个线程第"+i+"次循环");

                      try {

                          Thread.sleep(1000);

                      } catch (InterruptedException e) {

                      e.printStackTrace();

                      }

               }

          }

       };

         //设置线程2为守护线程:当虚拟机发现所有的线程都为守护线程的时候,虚拟机体退出

         t2.setDaemon(true);

         t1.start();

         t2.start();

好了,咱们今天的探讨到此结束!

微冷的雨之Java中的多线程初理解(一)的更多相关文章

  1. Java 中传统多线程

    目录 Java 中传统多线程 线程初识 线程的概念 实现线程 线程的生命周期 常用API 线程同步 多线程共享数据的问题 线程同步及实现机制 线程间通讯 线程间通讯模型 线程中通讯的实现 @(目录) ...

  2. Java中使用多线程、curl及代理IP模拟post提交和get访问

    Java中使用多线程.curl及代理IP模拟post提交和get访问 菜鸟,多线程好玩就写着玩,大神可以路过指教,小弟在这受教,谢谢! 更多分享请关注微信公众号:lvxing1788 ~~~~~~ 分 ...

  3. 【转】Java中的多线程学习大总结

    多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程 ...

  4. Java中的 多线程编程

    Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ...

  5. java中的多线程 // 基础

    java 中的多线程 简介 进程 : 指正在运行的程序,并具有一定的独立能力,即 当硬盘中的程序进入到内存中运行时,就变成了一个进程 线程 : 是进程中的一个执行单元,负责当前程序的执行.线程就是CP ...

  6. Java中的多线程=你只要看这一篇就够了

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  7. Android学习记录(5)—在java中学习多线程下载之断点续传②

    在上一节中我们学习了在java中学习多线程下载的基本原理和基本用法,我们并没有讲多线程的断点续传,那么这一节我们就接着上一节来讲断点续传,断点续传的重要性不言而喻,可以不用重复下载,也可以节省时间,实 ...

  8. Java中使用多线程、curl及代理IP模拟post提交和get訪问

    Java中使用多线程.curl及代理IP模拟post提交和get訪问 菜鸟,多线程好玩就写着玩.大神能够路过不吝赐教.小弟在这受教.谢谢! 很多其它分享请关注微信公众号:lvxing1788 ~~~~ ...

  9. Java中的多线程技术全面详解

    本文主要从整体上介绍Java中的多线程技术,对于一些重要的基础概念会进行相对详细的介绍,若有叙述不清晰或是不正确的地方,希望大家指出,谢谢大家:) 为什么使用多线程 并发与并行 我们知道,在单核机器上 ...

随机推荐

  1. UWP 颜色选择器(ColorPicker) 和 自定义的Flyout(AdvancedFlyout)

    ColorPicker 故事背景 项目里面需要一个像Winfrom里面那样的颜色选择器,如下图所示: 在网上看了一下.没有现成的东东可以拿来使用.大概查看了一下关于颜色的一些知识,想着没人种树,那就由 ...

  2. RPC框架性能基本比较测试

    RPC框架:gRPC.Thrift.Wildfly.Dubbo 原文链接:http://www.open-open.com/lib/view/open1426302068107.html gRPC是G ...

  3. sprint3

    Sprint 3计划会议: 团队: 郭志豪:http://www.cnblogs.com/gzh13692021053/ 杨子健:http://www.cnblogs.com/yzj666/ 刘森松: ...

  4. JAVA正则表达式中如何匹配反斜杠 \

    有时候我们需要匹配反斜杠,你可能会把对应的正则表达式写成 "\\" 然后可能会有如下输出: Exception in thread "main" java.ut ...

  5. WPF CodeBehind后台动态创建图片及添加事件

    问题:WPF中DataGrid需要动态生成列并绑定值,首列包含图片和文本,点击图片触发事件. 难点:1.图片资源在VisualTree中的绑定   2.图片的事件绑定 public class Mai ...

  6. [基础技能] 安全技术——哈希算法密码破解之彩虹表(Rainbow Table)学习

    1.基础知识 刚刚学习过数字签名的相关知识,以及数字签名的伪造技术,而伪造数字签名归根结底就是密码破解的一个过程,然而直接破解的速度是非常缓慢的,所以有人想出一种办法,直接建立出一个数据文件,里面事先 ...

  7. Git使用出错:Couldn‘t reserve space for cygwin‘s heap, Win32

    今天使用Git在命令行下更新代码遇到了问题,起初觉得是自己安装某软件导致冲突,从网上搜索了一下找到类似问题,成功解决问题. 错误信息如下: E:\storm-sql>git pull origi ...

  8. 弱省互测#0 t2

    题意 给定两个字符串 A 和 B,求下面四个问题的答案: 1.在 A 的子串中,不是 B 的子串的字符串的数量. 2.在 A 的子串中,不是 B 的子序列的字符串的数量. 3.在 A 的子序列中,不是 ...

  9. [BZOJ4197][Noi2015]寿司晚宴

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 412  Solved: 279[Submit][Status] ...

  10. 二分图&网络流&最小割等问题的总结

    二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...