菜鸟初学Java的备忘录(三)

原创 2003年01月25日 08:47:00

2003年1月17日 星期五 晴
今天开始学习Java中多线程的实现.

线程是一些可以并行的,独立的执行的代码.之前我编的程序都只能做一件事情,也就是只有一个线程.多线程的编程就是可以将程序任务分成多个并行的子任务,同时运行,互不干扰.我对多线程的理解是从格斗游戏得来的.格斗游戏中两人对打就是通过两个线程来实现的吧,否则如何能够你出你的招,我发我的冲击波呢.

(1月18日)突然想到一个问题,补充一下.多线程是不是我们通常所说的多任务呢?我的理解是,不能这样说也可以这样说.
   简单说来,多线程提供了一种在进程内部进行多个线程并行调度的机制,而多任务则提供的是在一个操作系统内部运行多个进程的机制.
   多任务操作系统(如Windows)的基本原理是这样的:操作系统将CPU的时间片分配给多个线程,每个线程在操作系统指定的时间片内完成(注意,这里的多个线程是分属于不同进程的).操作系统不断的从一个线程的执行切换到另一个线程的执行,如此往复,宏观上看来,就好像是多个线程在一起执行.由于这多个线程分属于不同的进程,因此在我们看来,就好像是多个进程在同时执行,这样就实现了多任务.Whoops,真绕口.
  如上,多线程和多任务是有很明显的区别的.但是再想一下,在一个应用程序内实现多线程不也是靠CPU分配时间片吗?既然原理是相同的,那么多线程也可以说是多任务的.


一个Java程序启动后,就已经有一个线程在运行,我们可以通过下面的例子来初步建立一个线程的实际印象

class testthread{
  public static void main(String args[]){
    Thread t=Thread.currentThread();
    t.setName("This Thread is running");
    System.out.println("The running thead:"+t);
    try{
      for(int i=0;i<5;i++)
      {
        System.out.println("Sleep time"+i);
        Thread.sleep(1000);//挂起线程,就是让线程休息一会儿,不占用系统资源,因此其它线程可以继续.这里的Thread缺省表示主线程
      }
    }catch(InterruptedException e){System.out.println("thread has wrong");}
  }
}


  这只是一个线程,那么我们怎么实现多个线程呢?又怎样让线程做我安排它要做的事情呢?
  实现线程体的构造有两种方法.
  第一种方法是通过继承构造线程体.
  在Java中专门有一个Thread类,这个类里面有一个函数run(),里面记录着线程要完成的操作,就好像通常所说的主函数main()一样,run()函数运行完了,线程就结束了.通过继承这个类,我们可以定义我们自己的线程,在run函数中告诉它该做什么事情.下面的程序就是继承了一个SimpleThread类,用两个线程来输出HelloWorld.

public class TwoThread{

  public static void main(String args[]){
    new SimpleThread("HelloWorld1").start();//创建两个线程的实例,就这么简单
    new SimpleThread("HelloWorld2").start();
  }

}
  class SimpleThread extends Thread{ file://真正的内容在这里
    public SimpleThread(String str){
      super(str);//super代表SimpleThread类的直接父类,这里就是Thread
    }

file://我们要线程做的事情都在这里了
    public void run(){
      for(int i=0;i<10;i++){
        System.out.println(i+" "+getName());
        try{
          sleep((int)(Math.random()*1000));
        }catch(InterruptedException e){}
      }
      System.out.println("Done!"+getName());  
   }
}

运行的结果是两个线程交替显示各自的HelloWorld十次,输出是混在一起的,因为两个线程是同时运行的.


第二种方法是通过启动接口构造线程体.在任意实现了启动接口的类当中,比如下面的twothread类,都可以实现多线程,我所需要做的就是在这个类的定义当中加上一个run函数.例程如下

class TwoThread implements Runnable{
  TwoThread(){
    Thread t1=Thread.currentThread();
    t1.setName("The first main thread");
    System.out.println("The running thead:"+t1);
    Thread t2=new Thread(this,"the second thread");//注意这里的this,它表明新线程即t2将会做的事情由this对象来决定,也就是由twothread的run函数来决定
    System.out.println("create another thread");
    t2.start();//调用该函数将使线程从run函数开始执行
    try{
      System.out.println("first thread will sleep");
      Thread.sleep(3000);
    }catch(InterruptedException e){System.out.println("first thread has wrong");}
   System.out.println("first thread exit");
  }

  public void run()//定义run()函数,在本程序中也就是t2这个新的线程会做的事情
  {
    try{
      for(int i=0;i<5;i++)
        {
          System.out.println("sleep time for thread 2:"+i);
          Thread.sleep(1000);
        }
    }catch(InterruptedException e){System.out.println("thread has wrong");}
    System.out.println("second thread exit");
  }
  public static void main(String args[]){
    new TwoThread();//触发构造函数
  }
}

运行的结果如下:
The running rhread:Thread[The first main thread,5,main]
creat another thread
first thread will sleep
Sleep time for thread 2:0
Sleep time for thread 2:1
Sleep time for thread 2:2
first thread exit
Sleep time for thread 2:3
Sleep time for thread 2:4
second thread exit

扯扯别的.我们注意到很多Java程序开头都有import语句,好像和C的#include和Delphi的uses很象哦.import是Java的关键词,负责调入包(package).包由一组类和界面组成,是管理大型名字空间,避免名字冲突的工具.
Java提供了很多包供我们使用,主要如下:

java.applet
设计Applet的类

java.awt
窗口工具包,包含了产生GUI元素的类

java.io
文件输入输出类

java.lang
java语言类,包含:对象,线程,异常出口,系统,整数,原点,数字,字符等

java.net
Socket类及与TCP/IP相关的类

java.util
一些程序的同步类

...
 
  晚上粗略的翻看了一下Java类的概念.作为面向对象编程的基本元素,类的思想在Java当中体现的比C++更为突出.不象C++还保持着对面向过程语言的兼容,Java的程序里面只有类,是彻头彻尾的面向对象,举个例子,"hello"这个字府串也是一个对象,我们可以调用"Hello".equalsIgnoreCase()来判断它是否和其它字符串相同.我们通常在C中看到的主程序Main在Java中也要封装到类当中,通过类来引用.

  类的基本性质在Java中的体现无非就是重载,继承和多态.重载是指创建名字相同,参数不同的成员函数,是横向的.继承是从祖先类继承变量和成员函数,是纵向的.多态性举例说来,体现在程序的运行当中,实例变量可以根据需要选择以父类的实例出现或以子类的实例出现.

  这些东西多写写,给脑袋的刺激会更多些,记得更牢些,免得象上次那样应聘时,主考官问我面向对象的几个性质是什么,我居然都没能够答全,真是奇郁闷啊.

菜鸟初学Java的备忘录(九)

2003年1月25日 星期六 雨我突然发现了利用接口实现多线程和利用类构造线程体的不同了,以前我好像并没有太多的注意.利用类构造线程体的时候,需要使用这个类来定义线程对象,比如MyThread thr...
  • xm4014
  • xm4014
  • 2003年01月27日 10:31
  • 823

菜鸟初学Java的备忘录(六)

2003年1月21日 星期二 晴通过程序建立了实际的概念之后,现在应该回到最开始的问题,Socket是什么?是实现计算机通信的一种方式,这毫无疑问.但如何能够用最容易理解的语言比较形象而又不偏颇的描述...
  • xm4014
  • xm4014
  • 2003年01月24日 17:23
  • 805

菜鸟初学Java的备忘录(四)

2003年1月19日 星期天 晴说了那么多,线程的几个基本函数都没有记下来,现在来补启动一个线程T1=new YourThread();T1.start()操作线程T1.run(),这个前面说过了,启...
  • xm4014
  • xm4014
  • 2003年01月24日 17:42
  • 736

菜鸟初学Java的备忘录(十)

2003年1月26日 星期日 雨回顾一下昨天所学习的基于连接池的Socket,其原理中的要点如下:服务器开放有限个PooledConnectionHandler线程用来处理连接;客户的连接请求均加入到...
  • xm4014
  • xm4014
  • 2003年01月29日 14:06
  • 832

菜鸟初学Java的备忘录(五)

2003年1月20日 星期一 阴对几个Java的基础知识作一下补充。一.异常Java对异常的处理同Delphi一样,不是刻意的去避免它的发生,而是等它发生后去补救.Delphi的异常处理简单来说就是一...
  • xm4014
  • xm4014
  • 2003年01月24日 17:00
  • 810

菜鸟初学Java的备忘录(八)

2003年1月24日 星期五 晴我在22号的笔记中不是有一个疑问吗?为什么我编的程序没有不同步的现象产生呢,我把它发到csdn上去了,现在我已经基本解决这个问题了,下面是论坛的回复纪录摘要回复人:bl...
  • xm4014
  • xm4014
  • 2003年01月28日 13:47
  • 789

菜鸟初学Java的备忘录(七)

2003年1月22日 星期三 晴我突然发现还有很多东西需要我弄明白,比如synchronized这个关键字的用法.因为在我昨天进行创建连接池套接字的研究的时候,发现假如我不弄清楚这个概念,根本就无法进...
  • xm4014
  • xm4014
  • 2003年01月24日 17:32
  • 725

菜鸟初学Java的备忘录(一)

2003年1月14日 星期二 晴今天第一次接触Java。虽然以前间或的也看了些书籍,但多是隔靴搔痒,上不了正席,绝不敢说自己懂Java。接触一门新的技术和初恋一样,都是第一次,但不同的是后者一般开始无...
  • xm4014
  • xm4014
  • 2003年01月24日 16:51
  • 1306

菜鸟初学Java的备忘录(二)

2003年1月16日 星期四 晴   Java的入门比我想象中的还要简单的多,目前为止我已经对Java的基本语法结构有所了解.但我知道,深入的研究任何一门语言,都需要时间和实践的积累.  Applet...
  • xm4014
  • xm4014
  • 2003年01月28日 16:55
  • 1000

备忘录实现 源码

首先创建保存备忘录信息的表: DbHelper.java [java] view plaincopy在CODE上查看代码片派生到我的代码片 package com.cjq.androi...
  • syf6568362
  • syf6568362
  • 2015年12月30日 16:15
  • 1537
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:菜鸟初学Java的备忘录(三)
举报原因:
原因补充:

(最多只允许输入30个字)