黑马程序员技术交流社区

标题: 【阳哥笔记】极速秒杀Java基础之笔记系列—Day12(多线程)! [打印本页]

作者: 阳哥忠粉    时间: 2015-6-5 15:03
标题: 【阳哥笔记】极速秒杀Java基础之笔记系列—Day12(多线程)!





笔记总链接:http://bbs.itheima.com/thread-200600-1-1.html

4、继承

4.12 包
   
    对类文件进行分类管理。
    给类提供多层命名空间。
    写在程序文件的第一行。

    类名的全称的是:包名.类名。
    包也是一种封装形式。


    示例1:
  1. package mypack;

  2. class PackageDemo{
  3.        public static void main(String[] args){
  4.             System.out.println("Hello Package!");
  5.        }
  6. }
复制代码
   运行结果:


    创建mypack文件夹,并且将PackageDemo.class放入其中,然后再次执行。

    运行结果:





    也可以通过javac命令直接创建mypack文件夹,然后执行。

   

    示例2:
    DemoA.java
  1. package packa;

  2. public class DemoA{
  3.        public void show(){
  4.             System.out.println("demoa show run");
  5.        }
  6. }
复制代码
    PackageDemo.java
  1. package mypack;

  2. class PackageDemo{
  3.        public static void main(String[] args){
  4.              packa.DemoA d = new packa.DemoA();
  5.              d.show();
  6.              System.out.println("Hello Package!");
  7.        }
  8. }
复制代码
    运行结果:


    P.S.
    包与包之间的类进行访问,被访问的包中的类必须是public的,被访问的包中的类的方法也必须是public的。

    示例3:
    DemoA.java  
  1. package packa;

  2. public class DemoA extends packb.DemoB{
  3.        public void show(){
  4.             method();
  5.             System.out.println("demoa show run");
  6.        }
  7. }
复制代码
    DemoB.java  
  1. package packb;
  2. public class DemoB{
  3.        protected void method(){
  4.             System. out.println("demob show run" );
  5.       }
  6. }
复制代码
    PackageDemo.java
  1. package mypack;

  2. class PackageDemo{
  3.        public static void main(String[] args){
  4.              packa.DemoA d = new packa.DemoA();
  5.              d.show();

  6.              packb.DemoB b = new packb.DemoB();
  7.              //b.method();//报错!无法访问DemoB中的protected修饰的method方法
  8.              System.out.println("Hello Package!");
  9.        }
  10. }
复制代码
    运行结果:


    包之间的访问:被访问的包中的类权限必须是public的。   
    类中的成员权限:public或者protected。
    protected是为其他包中的子类提供的一种权限。

    四种权限


    import
    一个程序文件中只有一个package,但可以有多个import。

    示例:
    DemoA.java
  1. package packa;

  2. public class DemoA extends packb.DemoB{
  3.        public void show(){
  4.             method();
  5.             System.out.println("demoa show run");
  6.        }
  7. }
复制代码
    DemoB.java  
  1. package packb;
  2. public class DemoB{
  3.        protected void method(){
  4.             System. out.println("demob show run" );
  5.       }
  6. }
复制代码
    PackageDemo.java
  1. package mypack;
  2. //import packa.DemoA;//导入了 packa包中的DemoA类。
  3. import packa.*; //导入了packa包中所有的类

  4. class PackageDemo{
  5.        public static void main(String[] args){
  6.             DemoA d = new DemoA();
  7.             d.show();
  8.       }
  9. }
复制代码
   运行结果:



    示例:
    有两个类:DemoA、DemoAbc。
    所在文件目录如下:
    packa\DemoA.class
    packa\abc\DemoAbc.class

    导包语句如下:
    import packa.*;
    import packa.abc.*;


    Jar包

    Java的压缩包。
    方便项目的携带。
    方便于使用,只要在classpath设置jar路径即可。
    数据库驱动,SSH框架等都是以jar包体现的。


    Jar包的操作:
    通过jar.exe工具对jar的操作。

    创建jar包:
    jar  -cvf  mypack.jar  packa packb

    查看jar包
    jar  -tvf  mypack.jar   [>定向文件]

    解压缩
    jar  -xvf  mypack.jar

    自定义jar包的清单文件
    jar –cvfm  mypack.jar  mf.txt  packa packb


5、多线程

5.1 多线程的概念

    5.1.1 进程、线程、多进程的概念
    进程:正在进行中的程序(直译)。
    线程:进程中一个负责程序执行的控制单元(执行路径)。

    P.S.
    1、一个进程中可以有多个执行路径,称之为多线程。
    2、一个进程中至少要有一个线程。
    3、开启多个线程是为了同时运行多部分代码,每一个线程都有自己运行的内容,这个内容可以称为线程要执行的任务。


    多线程的好处:解决了多部分代码同时运行的问题。
    多线程的弊端:线程太多,会导致效率的降低。

    其实,多个应用程序同时执行都是CPU在做着快速的切换完成的。这个切换是随机的。CPU的切换是需要花费时间的,从而导致了效率的降低。

    JVM启动时启动了多条线程,至少有两个线程可以分析的出来:
    1. 执行main函数的线程,该线程的任务代码都定义在main函数中。
    2. 负责垃圾回收的线程。


    示例:
  1. class Demo extends Object{
  2.        public void finalize(){
  3.             System.out.println("demo ok");
  4.        }
  5. }

  6. class ThreadDemo{
  7.        public static void main(String[] args){
  8.              new Demo();
  9.              new Demo();
  10.              System.gc();
  11.              new Demo();
  12.              System.out.println("Hello World!");
  13.       }
  14. }
复制代码
   运行结果:



    像这种情况,之所以先打印Hello World!再打印demo ok,是因为两条线程是分别执行的。


    像这种情况,只打印一个demo ok,是因为在垃圾回收器还没回收第二个Demo对象的时候,JVM就已经结束了。

    P.S.
    System类的gc方法告诉垃圾回收器调用finalize方法,但不一定立即执行。

    5.1.2 创建线程方式一:继承Thread类

    1. 定义一个类继承Thread类。
    2. 覆盖Thread类中的run方法。
    3. 直接创建Thread的子类对象创建线程。
    4. 调用start方法开启线程并调用线程的任务run方法执行。


    单线程程序示例:
  1. class Demo{
  2.       private String name ;
  3.       Demo(String name){
  4.              this.name = name;
  5.       }
  6.        public void show(){
  7.              for(int x = 0; x < 10; x++){
  8.                   System.out.println(name + "...x=" + x);
  9.             }
  10.       }
  11. }

  12. class ThreadDemo{
  13.        public static void main(String[] args){
  14.             Demo d1 = new Demo("旺财");
  15.             Demo d2 = new Demo("小强");
  16.             d1.show();
  17.             d2.show();
  18.       }
  19. }
复制代码
   运行结果:



    可以看到在单线程程序中,只有上一句代码执行完,下一句代码才有执行的机会。

    创建线程的目的就是为了开启一条执行路径,去运行指定的代码和其他代码实现同时运行,而运行的指定代码就是这个执行路径的任务。

    jvm创建的主线程的任务都定义在了主函数中。而自定义的线程,它的任务在哪儿呢?
    Thread类用于描述线程,线程是需要任务的。所以Thread类也有对任务的描述。这个任务就是通过Thread类中的run方法来体现。也就是说,run方法就是封装自定义线程运行任务的函数,run方法中定义的就是线程要运行的任务代码。

    开启线程是为了运行指定代码,所以只有继承Thread类,并复写run方法,将运行的代码定义在run方法中即可。


    多线程程序示例:
  1. class Demo extends Thread{
  2.       private String name ;
  3.       Demo(String name){
  4.              this.name = name;
  5.       }
  6.        public void run(){
  7.              for(int x = 0; x < 10; x++){
  8.                   System.out.println(name + "...x=" + x + "...ThreadName=" + Thread.currentThread ().getName());
  9.             }
  10.       }
  11. }

  12. class ThreadDemo{
  13.        public static void main(String[] args){
  14.             Demo d1 = new Demo("旺财");
  15.             Demo d2 = new Demo("xiaoqiang");
  16.             d1.start(); //开启线程,调用run方法。
  17.             d2.start();
  18.             for(int x = 0; x < 20; x++){
  19.                   System.out.println("x = " + x + "...over..." + Thread.currentThread().getName());
  20.             }
  21.       }
  22. }
复制代码
    运行结果:


    P.S.
    1、可以通过Thread的getName方法获取线程的名称,名称格式:Thread-编号(从0开始)。
    2、Thread在创建的时候,该Thread就已经命名了。源码如下:



~END~



~爱上海,爱黑马~



作者: 熊乾坤    时间: 2015-6-5 19:17
顶!顶!顶!顶!顶!顶!顶!
作者: Heroe    时间: 2015-6-5 22:13
更新这么快
作者: 灵界    时间: 2015-6-6 00:25
支持阳哥,标记一下,以后搞
作者: a5231865    时间: 2015-6-6 07:05
写不死就往死里写,嘿嘿,加油...
作者: 新缘    时间: 2015-6-6 09:33
{:3_46:}{:3_46:}{:3_46:}
作者: Huan220_欢    时间: 2015-6-6 09:50
很棒,很有用!加油!
作者: 全是爱    时间: 2015-6-6 11:38
不错不错!
作者: canyellwang    时间: 2015-6-6 16:01
给力!!!!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 漫漫无途    时间: 2015-6-6 16:11
支持一下
作者: 307323665    时间: 2015-6-6 22:34
额。加油。学习中!
作者: wx_iAuO26mH    时间: 2015-6-7 09:55
学习中 加油 formyself
作者: 熊乾坤    时间: 2015-6-7 15:03
顶!顶!顶!顶!顶!顶!顶!
作者: 307323665    时间: 2015-6-7 15:51
辛苦。。。
作者: xiaodong    时间: 2015-6-7 16:07
学习了,谢谢!!!
作者: 秋天-10    时间: 2015-6-8 10:03
杨哥太威武了
作者: yang9876q    时间: 2015-6-8 11:03
太牛了,赞一个
作者: 秋天-10    时间: 2015-6-9 09:45
真是太好了
作者: wx_d9b6mRbI    时间: 2015-6-9 14:24
学习速度真的跟不上阳哥的更新速度
作者: RockLee    时间: 2015-6-10 08:49
很好,顶一个
作者: jife94    时间: 2015-6-10 09:56
学习学习学习了
作者: wx_iAuO26mH    时间: 2015-6-10 11:13
加油  每天正能量
作者: 魏海洲    时间: 2015-6-10 22:33
顶!顶!顶!顶!顶!顶!顶!
作者: 魏海洲    时间: 2015-6-10 22:42
很棒,很有用!加油!
作者: wxRocky    时间: 2015-6-17 08:53
不错不错,必须赞!!!!!
作者: MQ_H    时间: 2015-6-18 10:08
支持支持
作者: 伟大的骗子    时间: 2015-6-21 08:33
多线程,多线程,今天开始学,嗷~
作者: 魏海洲    时间: 2015-6-21 23:00

顶!顶!顶!顶!顶!顶!顶!
作者: Huan220_欢    时间: 2015-6-23 19:52
辛苦了~~~赞一个
作者: hw3296416    时间: 2015-6-23 21:00
更新的好快,真是高效率。
作者: e275919713    时间: 2015-6-23 21:40
收藏 学习
作者: 魏海洲    时间: 2015-6-24 22:19

顶!顶!顶!顶!顶!顶!顶!
作者: Jackie7    时间: 2015-6-24 22:32
拿走,复习!
作者: 定格在永远    时间: 2015-6-25 11:33
阳哥, 能问你个问题吗,我用的qq登录的,黑马币兑换技术分时需要密码,密码忘了怎么办。
作者: 魏海洲    时间: 2015-6-25 18:55
支持阳哥,标记一下,以后搞
作者: 发抖的_DtYJA    时间: 2015-6-27 20:31

学习速度真的跟不上阳哥的更新速度
作者: a80194367    时间: 2015-7-4 20:04
阳哥,你这么nb,嫂子她知道吗
作者: cemabenteng    时间: 2015-7-7 21:34
非常感谢,怎么没看到API的啊
作者: wanghua1    时间: 2015-7-7 23:58
顶!!!顶!!!顶!!!顶!!!顶!!!顶!!!
作者: 1115302782    时间: 2015-7-8 00:05
加油!加油!
作者: 路人乙1989    时间: 2015-7-11 16:00
笔记很好很实用
作者: liuch111    时间: 2015-7-12 09:10
阳哥v5                        
作者: lwen    时间: 2015-7-12 09:27
赞一个!!!!
作者: maizi1912    时间: 2015-7-12 10:27
天天都看 很有用
作者: 星痕-凌    时间: 2015-7-17 21:22
不错 、顶!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 星痕-凌    时间: 2015-7-17 21:23
不错 、顶!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 小哥黑马    时间: 2015-7-18 00:07
干货!!!老师就是挑干的讲
作者: javazhang    时间: 2015-7-19 19:20
学习了。。。。。。。。。。
作者: rzb2010    时间: 2015-7-22 23:48
攒一个,我天天看这
作者: 卷发碎碎念    时间: 2015-7-26 23:22
今天就先看到这了,明天再看。
作者: 15917846944    时间: 2015-7-27 22:08
感谢阳哥哥!!!!!!!!!
作者: 王勋亮    时间: 2015-7-28 16:53
越看越晕……太急躁了
作者: 王勋亮    时间: 2015-7-28 18:37
包的实例3好像有错误
作者: 放心飞    时间: 2015-8-27 14:19
又看完一篇了,继续努力,加油!
作者: 放心飞    时间: 2015-8-27 15:51
java的世界就是精彩啊。越来越干兴趣了
作者: a513200780    时间: 2015-8-28 19:38
好东西,顶!d=====( ̄▽ ̄*)
作者: 至尊幽蓝    时间: 2015-8-30 16:10
支持,谢谢分享。
作者: yangshibai    时间: 2015-9-21 23:26
顶一个。。。。
作者: lktz    时间: 2016-2-2 02:38
标记一下
作者: zxjuzhu    时间: 2016-6-9 10:51
笔记详尽,赞一个!
作者: 戎马生涯    时间: 2016-6-9 17:13
感谢分享~~~
作者: Fangjie    时间: 2016-6-9 18:50
谢谢学长,给力!
作者: Bin丶    时间: 2016-6-10 21:17
谢谢楼主分享

作者: 数码店    时间: 2016-6-10 21:20
赞赞赞赞赞赞
作者: tianzhu2725    时间: 2016-6-10 21:25
好详细啊 顶
作者: 黑猫的消失    时间: 2016-6-10 21:32
阳哥说的很细,学习了
作者: Array先生    时间: 2016-9-11 07:11
太详尽了,给个赞




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2