分享
 
 
 

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

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有