今天开始学习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{
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;isystem.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{
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的备忘录(三)的内容,更多相关内容请关注PHP中文网(www.php.cn)!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号