Java线程总结

Java线程总结
Java线程总结

Java线程总结

在论坛上面常常看到初学者对线程的无可奈何,所以总结出了下面一篇文章,希望对一些正在学习使用java线程的初学者有所帮助。

首先要理解线程首先需要了解一些基本的东西,我们现在所使用的大多数操作系统都属于多任务,分时操作系统。正是由于这种操作系统的出现才有了多线程这个概念。我们使用的w indows,linux就属于此列。什么是分时操作系统呢,通俗一点与就是可以同一时间执行多个程序的操作系统,在自己的电脑上面,你是不是一边听歌,一边聊天还一边看网页呢?但实际上,并不上c pu在同时执行这些程序,c pu只是将时间切割为时间片,然后将时间片分配给这些程序,获得时间片的程序开始执行,不等执行完毕,下个程序又获得时间片开始执行,这样多个程序轮流执行一段时间,由于现在c pu 的高速计算能力,给人的感觉就像是多个程序在同时执行一样。

一般可以在同一时间内执行多个程序的操作系统都有进程的概念。一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间,一组系统资源。在进程概念中,每一个进程的内部数据和状态都是完全独立的。因此可以想像创建并执行一个进程的系统开像是比较大的,所以线程出现了。在java中,程序通过流控制来执行程序流,程序中单个顺序的流控制称为线程,多线程则指的是在单个程序中可以同时运行多个不同的线程,执行不同的任务。多线程意味着一个程序的多行语句可以看上去几乎在同一时间内同时运行。(你可以将前面一句话的程序换成进程,进程是程序的一次执行过程,是系统运行程序的基本单位)

线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制;但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系统在产生一个线程。或者在各个线程之间切换时,负担要比进程小的多,正因如此,线程也被称为轻负荷进程(light-w eight proc ess)。一个进程中可以包含多个线程。

多任务是指在一个系统中可以同时运行多个程序,即有多个独立运行的任务,每个任务对应一个进程,同进程一样,一个线程也有从创建,运行到消亡的过程,称为线程的生命周期。用线程的状态(state)表明线程处在生命周期的哪个阶段。线程有创建,可运行,运行中,阻塞,死亡五中状态.通过线程的控制与调度可使线程在这几种状态间转化每个程序至少自动拥有一个线程,称为主线程。当程序加载到内存时,启动主线程。

[线程的运行机制以及调度模型]

java中多线程就是一个类或一个程序执行或管理多个线程执行任务的能力,每个线程可以独立于其他线程而独立运行,当然也可以和其他线程协同运行,一个类控制着它的所有线程,可以决定哪个线程得到优先级,哪个线程可以访问其他类的资源,哪个线程开始执行,哪个保持休眠状态。

下面是线程的机制图:

线程的状态表示线程正在进行的活动以及在此时间段内所能完成的任务.线程有创建,可运行,运行中,阻塞,死亡五中状态。一个具有生命的线程,总是处于这五种状态之一:

1.创建状态

使用new运算符创建一个线程后,该线程仅仅是一个空对象,系统没有分配资源,称该线程处于创建状态(new thread)

2.可运行状态

使用start()方法启动一个线程后,系统为该线程分配了除CPU外的所需资源,使

该线程处于可运行状态(Runnable)

3.运行中状态

Java运行系统通过调度选中一个Runnable的线程,使其占有CPU并转为运行中状

态(Running)。此时,系统真正执行线程的run()方法.

4.阻塞状态

一个正在运行的线程因某种原因不能继续运行时,进入阻塞状态(Bloc ked)

5.死亡状态

线程结束后是死亡状态(Dead)[Page]

同一时刻如果有多个线程处于可运行状态,则他们需要排队等待CPU资源.此时每个线程自动获得一个线程的优先级(priority),优先级的高低反映线程的重要或紧急程度。可运行状态的线程按优先级排队,线程调度依据优先级基础上的"先到先服务"原则。

线程调度管理器负责线程排队和CPU在线程间的分配,并由线程调度算法进行调度。当线程调度管理器选种某个线程时,该线程获得CPU资源而进入运行状态。

线程调度是先占式调度,即如果在当前线程执行过程中一个更高优先级的线程进入可运行状态,则这个线程立即被调度执行。先占式调度分为:独占式和分时方式.

独占方式下,当前执行线程将一直执行下去,直到执行完毕或由于某种原因主动放弃CPU,或CP U被一个更高优先级的线程抢占。

分时方式下,当前运行线程获得一个时间片,时间到时,即使没有执行完也要让出CPU,进入可运行状态,等待下一个时间片的调度.系统选中其他可运行状态的线程执行分时方式的系统使每个线程工作若干步,实现多线程同时运行

另外请注意下面的线程调度规则(如果有不理解,不急,往下看):

①如果两个或是两个以上的线程都修改一个对象,那么把执行修改的方法定义为被同步的(Sync hronized),如果对象更新影响到只读方法,那么只度方法也应该定义为同步的

②如果一个线程必须等待一个对象状态发生变化,那么它应该在对象内部等待,而不是在外部等待,它可以调用一个被同步的方法,并让这个方法调用w ait()

③每当一个方法改变某个对象的状态的时候,它应该调用notifyAll()方法,这给等待队列的线程提供机会来看一看执行环境是否已发生改变

④记住w ait(),notify(),notifyAll()方法属于Objec t类,而不是Thread类,仔细检查看是否每次执行w ait()方法都有相应的notify()或notifyAll()方法,且它们作用与相同

的对象在java中每个类都有一个主线程,要执行一个程序,那么这个类当中一定要有main方法,这个man方法也就是java c lass中的主线程。你可以自己创建线程,有两种方法,一是继承Thread类,或是实现Runnable接口。一般情况下,最好避免继承,因为java中是单根继承,如果你选用继承,那么你的类就失去了弹性,当然也不能全然否定继承Thread,该方法编写简单,可以直接操作线程,适用于单重继承情况。至于选用那一种,具体情况具体分析。

e g.继承Thre ad

public c lass MyThread_1 extends Thread{public void run(){//some c ode }}

e g.实现Runnable接口

public c lass MyThread_2 implements Runnable{pub lic void run(){//some c ode }}当使用继承创建线程,这样启动线程:

new MyThread_1().start()

当使用实现接口创建线程,这样启动线程:

new Thread(new MyThread_2()).start()

注意,其实是创建一个线程实例,并以实现了Runnable接口的类为参数传入这个实例,当执行这个线程的时候,MyThread_2中run里面的代码将被执行。

下面是完成的例子:

public c lass MyThread implements Runnable{ pub lic void

run(){ System.out.println("My Name is "+Thread.c urrentThread().getName()); } public static void main(String[] args){new Thread(new MyThread()).start(); }}执行后将打印出:

My Name is Thread-0

你也可以创建多个线程,像下面这样

new Thread(new MyThread()).start();new Thread(new MyThread()).start();new Thread(new MyThread()).start();

那么会打印出:

My Name is Thread-0

My Name is Thread-1

My Name is Thread-2

看了上面的结果,你可能会认为线程的执行顺序是依次执行的,但是那只是一般情况,千万不要用以为是线程的执行机制;影响线程执行顺序的因素有几点:首先看看前面提到的优先级别[Page]

public c lass MyThread implements Runnable{

public void run(){

System.out.println("My Name is "+Thread.c urrentThread().getName());

}

public static void main(String[] args){

Thread t1=new Thread(new MyThread());

Thread t2=new Thread(new MyThread());

Thread t3=new Thread(new MyThread());

t2.setPriority(Thread.MAX_PRIO RITY);//赋予最高优先级

t1.start();t2.start();t3.start();

}

}

再看看结果:

My Name is Thread-1

My Name is Thread-0

My Name is Thread-2

线程的优先级分为10级,分别用1到10的整数代表,默认情况是5。上面的

t2.setPriority(T hread.MAX_PRIO RITY)等价与t2.setPriority(10)。然后是线程程序本身的设计,比如使用sleep,yie ld,join,w a it等方法(详情请看JDKDoc ument) public c lass MyThread implements Runnable{

public void run(){

try{

int sleepT ime=(int)(Math.random()*100);//产生随机数字

Thread.c urrentThread().sleep(sleepTime);//让其休眠一定时间,时间又上面

sleepTime决定//

public static void sleep(long m illis)throw InterruptedExc eption (API)

System.out.println(Thread.c urrentThread().getName()+" 睡了 "+sleepTime);

}

c atc h(InterruptedExc eption ie)//由于线程在休眠可能被中断,所以调用sleep方法的时候需要捕捉异常

{

ie.printStac kTrac e();

}

}

public static void main(String[] args){

Thread t1=new Thread(new MyThread());

Thread t2=new Thread(new MyThread());

Thread t3=new Thread(new MyThread());

t1.start();t2.start();t3.start();

}

}

执行后观察其输出:

Thread-0 睡了 11

Thread-2 睡了 48

Thread-1 睡了 69

上面的执行结果是随机的,再执行很可能出现不同的结果。由于上面我在run中添加了休眠语句,当线程休眠的时候就会让出c pu,c pu将会选择执行处于runnable状态中的其他线程,当然也可能出现这种情况,休眠的Thread立即进入了runnable状态,c pu再次执行它。

[线程组概念]

线程是可以被组织的,java中存在线程组的概念,每个线程都是一个线程组的成员,线程组把多个线程集成为一个对象,通过线程组可以同时对其中的多个线程进行操作,如启动一个线程组的所有线程等。Java的线程组由https://www.360docs.net/doc/8810603728.html,ng包中的Thread——Group类实现。

ThreadGroup类用来管理一组线程,包括:线程的数目,线程间的关系,线程正在执行的操作,以及线程将要启动或终止时间等.线程组还可以包含线程组.在Java的应用程序中,最高层的线程组是名位main的线程组,在main中还可以加入线程或线程组,在mian的子线程组中也可以加入线程和线程组,形成线程组和线程之间的树状继承关系。像上面创建的线程都是属于main这个线程组的。

借用上面的例子,main里面可以这样写:

public static void main(String[] args){

/***************************************ThreadGroup(String name) ThreadGroup(ThreadGroup parent, String name)

***********************************/

ThreadGroup group1=new ThreadGroup("group1");

ThreadGroup group2=new ThreadGroup(group1,"group2");

Thread t1=new Thread(group2,new MyThread());

Thread t2=new Thread(group2,new MyThread());

Thread t3=new Thread(group2,new MyThread());

t1.start();t2.start();t3.start();[Page]

}

线程组的嵌套,t1,t2,t3被加入group2,group2加入group1。另外一个比较多就是关于线程同步方面的,试想这样一种情况,你有一笔存款在银行,你在一家银行为你的账户存款,而你的妻子在另一家银行从这个账户提款,现在你有1000块在你的账户里面。你存入了1000,但是由于另一方也在对这笔存款进行操作,人家开始执行的时候只看到账户里面原来的1000元,当你的妻子提款1000元后,你妻子所在的银行就认为你的账户里面没有钱了,而你所在的银行却认为你还有2000元。

看看下面的例子:

c lass BlankSav ing //储蓄账户{

private static int money=10000;

public void add(int i){

money=money+i;

System.out.println("Husband 向银行存入了 [¥"+i+"]");

}

public void get(int i){

money=money-i;

System.out.println("W ife 向银行取走了 [¥"+i+"]");

if(money<0)

System.out.println("余额不足!");

}

public int show Money(){

return money;

}

}

c lass Operater implements Runnab le{

String name;

BlankSav ing bs;

public Operater(BlankSav ing b,String s){

name=s;bs=b;

}

public static void oper(String name,BlankSaving bs){

if(name.equals("husband")){

try{

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

Thread.c urrentThread().sleep((int)(Math.rando m()*300));

bs.add(1000);

}

}

c atc h(InterruptedExc eption e){}

}

else{

try{

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

Thread.c urrentThread().sleep((int)(Math.random()*300));

bs.get(1000);

}

}

c atc h(InterruptedExc eption e){}

}

}

public void run(){

oper(name,bs);

}

}

public c las s BankTest {

public static void main(String[] args)throw s InterruptedExc eption{

BlankSav ing bs=new BlankSaving();

Operater o1=new Operater(bs,"husband");

Operater o2=new Operater(bs,"w ife");

Thread t1=new Thread(o1);

Thread t2=new Thread(o2);

t1.start();t2.start();

Thread.c urrentThread().sleep(500);

}

}

下面是其中一次的执行结果:

---------first--------------

Husband 向银行存入了 [¥1000]

Wife 向银行取走了 [¥1000]

Wife 向银行取走了 [¥1000]

Husband 向银行存入了 [¥1000]

Wife 向银行取走了 [¥1000]

Husband 向银行存入了 [¥1000]

Wife 向银行取走了 [¥1000]

Husband 向银行存入了 [¥1000]

Wife 向银行取走了 [¥1000]

Husband 向银行存入了 [¥1000]

Husband 向银行存入了 [¥1000]

Wife 向银行取走了 [¥1000]

Husband 向银行存入了 [¥1000]

Husband 向银行存入了 [¥1000]

Wife 向银行取走了 [¥1000]

Wife 向银行取走了 [¥1000]

Husband 向银行存入了 [¥1000]

Wife 向银行取走了 [¥1000]

Wife 向银行取走了 [¥1000]

Husband 向银行存入了 [¥1000]

看到了吗,这可不是正确的需求,在husband还没有结束操作的时候,w ife就插了进来,这样很可能导致意外的结果。解决办法很简单,就是将对数据进行操作方法声明为sync hronized,当方法被该关键字声明后,也就意味着,如果这个数据被加锁,只有一个对象得到这个数据的锁的时候该对象才能对这个数据进行操作。也就是当你存款的时候,这笔账户在其他地方是不能进行操作的,只有你存款完毕,银行管理人员将账户解锁,其他人才能对这个账户进行操作。[Page]

修改public static void oper(String name,BlankSav ing bs)为public static void oper(String name,BlankSav ing bs),再看看结果:

Husband 向银行存入了 [¥1000]

Husband 向银行存入了 [¥1000]

Husband 向银行存入了 [¥1000]

Husband 向银行存入了 [¥1000]

Husband 向银行存入了 [¥1000]

Husband 向银行存入了 [¥1000]

Husband 向银行存入了 [¥1000]

Husband 向银行存入了 [¥1000]

Husband 向银行存入了 [¥1000]

Husband 向银行存入了 [¥1000]

Wife 向银行取走了 [¥1000]

Wife 向银行取走了 [¥1000]

Wife 向银行取走了 [¥1000]

Wife 向银行取走了 [¥1000]

Wife 向银行取走了 [¥1000]

Wife 向银行取走了 [¥1000]

Wife 向银行取走了 [¥1000]

Wife 向银行取走了 [¥1000]

Wife 向银行取走了 [¥1000]

Wife 向银行取走了 [¥1000]

当丈夫完成操作后,妻子才开始执行操作,这样的话,对共享对象的操作就不会有问题了。

[wait and notify]

你可以利用这两个方法很好的控制线程的执行流程,当线程调用w ait方法后,线程将被挂起,直到被另一线程唤醒(notify)或则是如果w ait方法指定有时间得话,在没有被唤醒的情况下,指定时间时间过后也将自动被唤醒。但是要注意一定,被唤醒并不是指马上执行,而是从组塞状态变为可运行状态,其是否运行还要看c pu的调度。

事例代码:

c lass MyThread_1 extends Thread{

Objec t loc k;public MyThread_1(Objec t o){loc k=o;}

public void run(){

try{

sync hronized(loc k){

System.out.println("Ent er Thread_1 and w ait");l

oc k.w ait();

System.out.println("be notif ied");

}

}

c atc h(InterruptedExc eption e){}

}

}

c lass MyThread_2 extends Thread{

Objec t loc k;

public MyThread_2(Objec t o){loc k=o;}

public void run(){

sync hronized(loc k){

System.out.println("Ent er Thread_2 and notify");

loc k.notify();

}

}

}

public c lass MyThread{

public static void main(String[] args){

int[] in=new int[0];//notic eMyThread_1

t1=new MyThread_1(in);

MyThread_2 t2=new MyThread_2(in);

t1.start();t2.start();

}

}

执行结果如下:

Enter Thread_1 and w ait

Enter Thread_2 and notify

Thread_1 be notified

可能你注意到了在使用w ait and notify方法得时候我使用了sync hronized块来包装这两个方法,这是由于调用这两个方法的时候线程必须获得锁,也就是上面代码中的loc k[],如果你不用sync hronized包装这两个方法的得话,又或则锁不一是同一把,比如在MyThread_2中sync hronized(loc k)改为sync hronized(this),那么执行这个程序的时候将会抛出https://www.360docs.net/doc/8810603728.html,ng.Illega lMon itorState Exc eption执行期异常。另外w ait and notify 方法是Objec t中的,并不在Thread这个类中。最后你可能注意到了这点:int[] in=new int[0];为什么不是创建new Objec t而是一个0长度的数组,那是因为在java中创建一个0长度的数组来充当锁更加高效。

Thread作为java中一重要组成部分,当然还有很多地方需要更深刻的认识,上面只是对Thread的一些常识和易错问题做了一个简要的总结,若要真正的掌握java的线程,还需要自己多做总结。

Java多线程和输入输出流

班级:13科技2班学号:201324131225 姓名:许耿宁 Java多线程和输入输出流 一、实验目的: 1.熟悉利用Thread类建立多线程方法。 2.熟悉利用Thread接口建立多线程方法。 3.熟悉Java的文件读写机制,练习输入输出流的使用。 二、实验内容: 1.阅读下列程序,分析并上机检验其功能。 public class DelayRunnable implements Runnable{ private static int count=0; private int no; private int delay; public DelayRunnable(){ count++; no=count; } public void run(){ try{ for (int i=0;i<10;i++){ delay=(int)(Math.random()*5000); Thread.sleep(delay); System.out.println("Thread "+no+" with a delay "+delay); } }catch(InterruptedException e){} } } class MyRunnable{ public static void main(String args[]){ DelayRunnable r1 = new DelayRunnable();

DelayRunnable r2 = new DelayRunnable(); Thread thread1=new Thread(r1); Thread thread2=new Thread(r2); thread1.start(); thread2.start(); try{ Thread.sleep(1000); }catch(InterruptedException e){ System.out.println("Thread wrong"); } } } 2.将上列程序利用Runnable接口改写,并上机检验。 3.创建简单的程序ThreeThread.java,该程序将创建三个线程,每个线程应当显示它所运行的时间(可以考虑使用Date类或Calendar类)。 4.键盘输入10个整数,从小到大进行排序。 5.接收键盘输入的字符串,用FileInputStream类将字符串写入文件,用 FileOutputStream类读出文件内容显示在屏幕上。 6.将一个文本文件的内容按行读出,每读出一行就顺序加上行号,并写入到另一个文件中。 三、实验要求: 1.通过实验掌握Thread 、Runnable使用方法; 2.程序必须能够实现多线程; 3.程序必须能够完成题目要求; 4.通过实验掌握文件输入输出流的使用方法; 5.程序必须能够从键盘接收字符串并保存在文件中; 6.程序必须能够读出文件内容显示在屏幕上; 7.写出实验报告。 四、实验代码及截图: 第一题: 在编译器上运行程序得到截图所示结果:

4:一个经典的多线程同步问题汇总

一个经典的多线程同步问题 程序描述: 主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数 -> sleep(50) -> 全局变量++ -> sleep(0) -> 输出参数和全局变量。 要求: 1.子线程输出的线程序号不能重复。 2.全局变量的输出必须递增。 下面画了个简单的示意图: 分析下这个问题的考察点,主要考察点有二个: 1.主线程创建子线程并传入一个指向变量地址的指针作参数,由于线程启动须要花费一定的时间,所以在子线程根据这个指针访问并保存数据前,主线程应等待子线程保存完毕后才能改动该参数并启动下一个线程。这涉及到主线程与子线程之间的同步。 2.子线程之间会互斥的改动和输出全局变量。要求全局变量的输出必须递增。这涉及到各子线程间的互斥。 下面列出这个程序的基本框架,可以在此代码基础上进行修改和验证。 //经典线程同步互斥问题 #include #include #include long g_nNum; //全局资源 unsigned int__stdcall Fun(void *pPM); //线程函数 const int THREAD_NUM = 10; //子线程个数 int main() { g_nNum = 0;

HANDLE handle[THREAD_NUM]; int i = 0; while (i < THREAD_NUM) { handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL); i++;//等子线程接收到参数时主线程可能改变了这个i的值} //保证子线程已全部运行结束 WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE); return 0; } unsigned int__stdcall Fun(void *pPM) { //由于创建线程是要一定的开销的,所以新线程并不能第一时间执行到这来int nThreadNum = *(int *)pPM; //子线程获取参数 Sleep(50);//some work should to do g_nNum++; //处理全局资源 Sleep(0);//some work should to do printf("线程编号为%d 全局资源值为%d\n", nThreadNum, g_nNum); return 0; } 运行结果:

it人员的实习工作总结

it人员的实习工作总结 it人员实习工作总结 时光飞逝,转眼了大三就结束了,经过三年的校园专业知识的学习,我将要步入社会参加工作,暑假到了,此时的我和同学们在学院领导老师的安排下,利用暑假时间,参加了这次专业实习。 此次实习的地点是xx一个IT公司,时间是一个月,我选的专业实习方向是大数据开发;大数据开发是以Java编程为基础,然后做大数据架构,数据导入,HDFS分布式文件系统,Hadoop 体系,环境搭建,云计算;因为时间相当有限,因此我们这次实习只学习了Java编程的基础。 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java 语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点[2] 。Java可以编写桌面应用程序、Web应用程序、分

布式系统和嵌入式系统应用程序等。桌面应用程序,又称为GUI 程序(Graphical User Interface),但是和GUI 程序也有一些区别。桌面应用程序将GUI 程序从GUI具体为“桌面”,使冷冰冰的像块木头一样的电脑概念更具有人性化,更生动和富有活力。运行桌面应用程序时,用户界面会出现在运行应用程序的机器屏幕上。应用程序和它的用户界面之间的消息通过机器的操作系统进行传递。通常情况下,这里只涉及到一台机器,不存在网络。 我们是通过做项目实战来学习Java编程的,在这一个月中,我们做了两个Java项目,一个是桌面应用程序:图书进销存系统,另一个是web应用程序:学生信息管理系统。 第一个项目是图书进销存系统,图书进销存系统是CS结构的,CS结构即客户端-服务器结构,使用的是eclipse集成开发环境,MySQL数据库进行该软件的开发;该系统的主要有出版社管理、书本管理、书的入库管理、销售管理等功能,通过这些简单的功能,可以让我们了解如何利用JDBC进行数据库操作、如何使用Java的反射机制以及如何对系统进行分层等知识点。在实现功能前,我们需要为这个系统建立界面和设计数据库。该系统共有六个界面,包括登录界面、销售管理界面、入库管理界面、书本管理界面、种类管理界面、出版社管理界面。设计数据库方面,该系统使用的是MySQL5.0作为数据库。在设计数据库前,我们可以确定,系统相关的表,从最基础开始,有出版社表、书

程序设计心得体会

程序设计心得体会 程序设计感受1 刚学习C#的时候,感觉很难,做的时候出现很多错误而且我是照着书打代码还有错误,那时的感觉是迷茫的。在学习的过程中,我还是坚持下来,虽然学的不是很好,但是慢慢就理解了,现在也不要仿照书打代码。现在讲讲做项目的感想。我们项目做不好也有一个小原因,是因为我们三个项目同时进行,而三个项目不同,在需求分析方面没有弄好,导致后面在做项目时,数据库出现了很多问题,所以我觉得现在我们项目不要做多,而是好好做一个项目,从需求开始就要做好每一步,到后面编程才不会出现特别多的错误。 不得不说:在老师检查完第一次之后,我去看了一下师兄做过的项目,就觉得自己这个项目相差太远了。我觉得我有以下几方面做不好:1.在刚上C#时老师叫我们现在就要做项目但我没有,一直等到老师快要检查时才急急忙忙的做。2.老师上完课,自己做完作业之后,没有好好的复习。其实我觉得三层架构也不难,三层结构就是主要调用了类,而类中定义了方法,归根到底我们还是引用了类中的方法实现它的功能,类就类似于C语言里的函数,因为在数据访问层要用到数据操作类所以要创建一个数据操作类。而我们建三层架构是为了就是倒觉得在表示层里实现一些功能能时要去分析,但是C#语言只学习过浅的知识,数据结构我们也没有学习所以分析起来就有点问题。但是所有问题都是觉得自己太懒,如果自己好好自学数据结构,学习离散数学,也许在分析功能模块会得到提高。所以本人决定寒假做一个像样的项目出来。 无论是学习还是做项目的过程中,耐心都要非常重要。有时出现错误,上网查了,自己又想了很久,又找同学讨论还是不能解决时就会有不想做的念头。因为自己曾经在大一时就是因为连关机都不会关,当时都吓到宿舍友了,觉得还是转专业好了。虽然转专业没有成功,

操作系统实验总结

操作系统实验总结 学号: 姓名: 班级:

在本学期的计算机操作系统这门课学习当中,为了更好的了解操作系统相关知识,我们通过OS Lab平台做了几个实验。在实验室的过程中,我对课堂上学到的操作系统的一些知识有了新的认识,同时还接触到了操作系统的相关源代码,而且通过实验的运行效果了解了平时我们看不到的操作系统的一些状况,收获还是很大的。下面先简要归纳在实验课上我做的几个实验的主要实验内容和实验步骤: 实验一:实验环境的使用 实验步骤: 1.1启动OS Lab OS Lab每次启动后都会首先弹出一个用于注册用户信息的对话框(可以选择对话框标题栏上的“帮助”按钮获得关于此对话框的帮助信息)。在此对话框中填入学号和姓名后,点击“确定”按钮完成本次注册。观察OS Lab主窗口的布局。OS Lab主要由下面的若干元素组成:菜单栏、工具栏以及停靠在左侧和底部的各种工具窗口,余下的区域用来放置编辑器窗口。 1.2 学习OS Lab的基本使用方法 练习使用OS Lab编写一个Windows控制台应用程序,熟悉OS Lab的基本使用方法(主要包括新建项目、生成项目、调试项目等)。 实验二:操作系统的启动 实验步骤: 2.1 准备实验 启动OS Lab,新建一个EOS Kernel项目,在“项目管理器”窗口中打开boot文件夹中的boot.asm和loader.asm两个汇编文件,按F7生成项目,生成完成后,使用Windows资源管理器打开项目文件夹中的Debug文件夹。找到由boot.asm生成的软盘引导扇区程序boot.bin文件,找到由loader.asm生成的loader程序loader.bin文件,记录下此文件的大小1566字节。 2.2 调试EOS操作系统的启动过程 2.2.1 使用Bochs做为远程目标机 将调试时使用的远程目标机修改为Bochs 2.2.2 调试BIOS程序 按F5启动调试, Bochs在CPU要执行的第一条指令(即BIOS的第一条指令)处中断,从Console窗口显示的内容中,我们可以获得关于BIOS第一条指令的相关信息,然后查看CPU 在没有执行任何指令之前主要寄存器中的数据,以及内存中的数据。 2.2.3 调试软盘引导扇区程序 练习从0x7c00处调试软盘引导扇区程序;查看boot.lst文件;调试过程——软盘引导扇区程序的主要任务就是将软盘中的loader.bin文件加载到物理内存的0x1000处,然后跳转到loader程序的第一条指令(物理地址0x1000处的指令)继续执行loader程序; 2.2.4 调试加载程序 调试过程——Loader程序的主要任务是将操作系统内核(kernel.dll文件)加载到内存中,然后让CPU进入保护模式并且启用分页机制,最后进入操作系统内核开始执行(跳转到kernel.dll的入口点执行); 2.2.5 调试内核 2.2.6 EOS启动后的状态和行为 查看EOS的版本号;查看EOS启动后的进程和线程的信息;查看有应用程序运行时进程和线程的信息

JAVA线程程序设计(小时钟)实验报告(附完整代码)

线程程序设计 一、课题内容和要求 内容:设计和编写一个编写一个指针式时钟程序,应用线程实现时钟的走动。 要求:本实验旨在通过实验,培养学生将JAVA 线程的相关知识点(包括线程调度,线程同步等)有机结合并加以综合应用,在实验中设计多线程程序的能力。 二、设计思路分析 class Clock:一个指针式时钟的主类 class Layout: 添加窗口和时钟组件 class ClockPaint:定义时钟组件 三、概要设计 public class Clock extends JFrame { public static void main(String[] s) ; } class Layout extends JFrame { public Layout(); } class ClockPaint extends JPanel implements Runnable { int x, y, r; int h, m, s; double rad = Math.PI / 180; public ClockPaint(int x, int y, int r); public void paint(Graphics g); public void run(); } 时钟的绘制:

运行时钟: 四、详细设计 import java.awt.*; import javax.swing.*; import java.util.*; public class Clock extends JFrame { public static void main(String[] s) { new Layout(); } } class Layout extends JFrame {// 添加窗口和时钟组件public Layout() { ClockPaint cp = new ClockPaint(20, 20, 70); add(cp);

java线程学习总结

java线程学习总结1(java thread培训总结1) 1.线程中一些基本术语和概念 (2) 1.1线程的几个状态 (2) 1.2 Daemon线程 (2) 1.3锁的定义 (2) 1.4死锁 (2) 1.5.Java对象关于锁的几个方法 (3) 1.6锁对象(实例方法的锁) (3) 1.7类锁 (4) 1.8.线程安全方法与线程不安全方法 (4) 1.9类锁和实例锁混合使用 (4) 1.10锁的粒度问题 (4) 1.11.读写锁 (5) 1.12 volatile (5) 2.线程之间的通讯 (5) 2.1屏障 (6) 2.2.锁工具类 (6) 2.3.条件变量 (6) 3. Java线程调度 (7) 3.1 Java优先级 (7) 3.2. 绿色线程 (7) 3.3 本地线程 (7) 3.4 Windows本地线程 (7) 3.5线程优先级倒置与继承 (8) 3.6循环调度 (8) 4.线程池 (8) 5工作队列 (9) 6.参考资料 (10)

1.线程中一些基本术语和概念 1.1线程的几个状态 初始化状态 就绪状态 运行状态 阻塞状态 终止状态 1.2 Daemon线程 Daemon线程区别一般线程之处是:主程序一旦结束,Daemon线程就会结束。 1.3锁的定义 为了协调多个并发运行的线程使用共享资源才引入了锁的概念。 1.4死锁 任何多线程应用程序都有死锁风险。当一组线程中的每一个都在等待一个只 有该组中另一个线程才能引起的事件时,我们就说这组线程死锁了。换一个说法就是一组线程中的每一个成员都在等待别的成员占有的资源时候,就可以说这组线程进入了死锁。死锁的最简单情形是:线程 A 持有对象X 的独占锁,并且在等待对象Y 的锁,而线程 B 持有对象Y 的独占锁,却在等待对象X 的锁。除非有某种方法来打破对锁的等待(Java 锁定不支持这种方法),否则死锁的线程将永远等下去。

JAVA暑期实习报告

实习总结报告 实习总结报告 一、实习目的 Java语言是一种高级计算机语言,具有简单,面向对象,安全,跨平台,支持多线程的特点。这次实习的目的是使我们掌握JA V A的基本知识,能运用JA V A来编写程序,解决一般性的问题,使得我们在完成本课程学习后,掌握JA V A的基本知识和初步的编程能力,为以后的学习和工作提供了一个非常有用的工具。 2、实习内容 1.鼠标拖动小球运动 …

MouseMotionListener{ //Graphics代表画笔 super.paint(g);//调用父类的paint方法 //设置画笔颜色 g.setColor(Color.BLUE); /*x,y代表要填充的圆弧的左上角坐标 代表填充圆弧的宽度 代表填充圆弧的高度 相对于开始角度,圆弧的跨越度*/ } @Override

x=e.getX();//获得圆心坐标 y=e.getY(); repaint();//重新画一个小球} @Override x=e.getX();//获得圆心坐标 y=e.getY(); repaint();//重新画一个小球 } x=200; y=200;//为小球坐标赋初始值 //为当前面板添加鼠标移动事件监听 this.addMouseMotionListener(this); }

public class MouseBallFrame extends JFrame{ public static void main(String[]args){ MouseBallFrame frame=new MouseBallFrame(); MouseBallPanel panel=new MouseBallPanel(); frame.add(panel); frame.setSize(1024,768); frame.setTitle("鼠标控制小球"); frame.setVisible(true); } } 这是第一次成功的设置窗口,面板,并将JA V A程序结果在窗口内显示,这似乎打开了另外一扇门,有更多的知识等着我去探索。(结果如图1) 图1 2.小球运动的屏幕保护程序

linux线程控制编程自学心得体会

linux线程控制编程自学心得体会 篇一:Linux学习心得 Linux学习心得总结 第二事业部 Linux简介: Linux是一套免费使用和自由传播的类Unix开源操作系统,是自由软件和开源代码的经典范例,由世界各地的成千上万的程序员设计和实现的。具有开放性、多用户、多任务、出色的速度性能、良好的用户界面、丰富的网络功能、可靠的系统安全、良好的可移植性、标准兼容性等特点,在服务器,嵌入式,工控等方面都有广泛的应用。目前风靡全球的Android智能系统也是基于Linux内核开发的。 第一次接触Linux是在上大二的时候,一位给我们上课的老师在课间闲聊时用教训的语气给我们说,计算机专业的学生应该去好好学Linux,你要不会Linux都不好意思说自己是计算机科班毕业的(当然这有点夸张了,这位老师一直是研究Linux的,对Linux比较狂热),总之他说了一大堆Linux的好处,比如开源啊,稳定性强,支持平台多等等。其实之前早就对Linux有所耳闻,但觉得这是专业人士才搞的东西,很高深,我离那一步还早着呢,所以当时也没听懂多少,听完过后只觉得Linux是个开源免费的操作系统,在Linux上面开发是比较有档次的,有前途的。于是,一兴奋,

回去就找了个师兄借了张Red Hat (Linux一个比较稳定的商业发行版本)的光盘,在自己电脑上装了个Linux系统,在上面装上了QQ,音视频播放器,练了练Linux的命令,编译运行了"hello world"之类的入门程序,玩了几天后,我发现了一个比较严重的问题,在Linux上没法玩魔兽和CS,兴奋劲一过,我的第一个Linux系统就在我的电脑分区下长眠了。 到后来,学校开了些以Linux为实验平台的课程,于是又把Linux系统拿出来,在上面做老师布置的作业,对Linux也更了解了,自己也能勉强在那上面做些简单的应用开发,学会了更多的命令,了解了何为gcc,makefile,vi,gdb,知道了怎样调试自己的程序,仅此而已。大三暑假找了个实习的工作,工作环境也是Linux方面的应用程序开发,实习了两个多月,跟着公司的老员工打杂,逐渐对Linux的应用开发也有了比较深入的了解,真正的产生了兴趣,自己也在Linux下做了些小东西,用socket+GTK完成了一个类似于QQ 的局域网聊天工具等,当时高兴了好几天。 毕业后的第一份工作也是Linux相关的开发工作,到后来来XX也做Linux,毕业快四年了,真正在Linux上做开发也有四年多,从应用开发到驱动开发,再到研究内核。做了这么多年来,不敢说有所成,但多少也有所得,有所感悟,

心得体会格式_1

心得体会格式 导语:以下是关于心得体会格式,希望可以帮助到你。 心得体会的标题可以采用以下几种形式: 1)、在XX活动(或XX工作)中的心得体会 2)、关于XX活动(或XX工作)心得体会(或心得) 3)、心得体会 1)、介绍在时间,什么地点,参加了什么培训,或是看了什么书,接触了什么榜样,感觉受益很深,感触很大。 2)、简要描述培训课程,描述一下那本书,或是写一下那位榜样的先进事迹。 3)、对照学习,书中的角色、精神,或是榜样的事迹,结合自身实际情况,进行一下反思,写出自己的心得体会和感想。 4)、在受启发之后,揭示主题,表明下步自己或是大家应该怎么做,必出倡议或是表表决心。 心得体会一般应在文章结尾的右下方写上姓名,也可以在文章标题下署名,写作日期放在文章最后。 20XX年3月5日至7日,我荣幸地参加了公司组织的赴南京水晶石公司的考察学习活动。在三天的学习交流中,我们与水晶石的领导及技术人员就行业发展的现状和未来前景,主流技术及双方业务内容进行了深入的交流探讨,水晶石公司向我们展示了包括北京XX奥运会场馆宣传片在内的

一系列优秀的成果,从中我学到了很多宝贵的知识,不仅开阔了视野,而且在技术方面也得到了显著的提高。 多线程分布式加载可以有效解决大型场景加载速度缓慢及消耗系统资源的问题,以视野范围和景深为准,有选择的进行场景显示。 根据场景自身特点及产品要求,相对热点地区进行模型细化和贴图质量提高,制定相应的飞行展示路线,实现场景热点的重点表现。 首先将场景动画在3DMAX中进行分层并单独渲染,而后在影视后期制作软件中对各个层的动画效果进行合并,最终形成可以表现场景形成过程的生长式视频动画,可借助Fly3d等相关引擎及加载ActiveX控件的方式实现在平台及网页上的展示。 针对现有的三维软件平台进行二次开发,形成一个相对独立健全的展示平台,其功能类似于插件。此平台的主要任务是:第一、弥补现有平台只支持单一贴图和材质的不足。例:目前skyline仅支持一张漫反射贴图,而不支持lightingmap烘焙的灯光贴图,大大降低了贴图质量。第二、取代烘焙贴图,在平台中实现模型光影效果的真实计算和三维全景展示。第三、对精细模型进行独立展示,其效果类似于旋转展台。 运用3DMAXScript脚本语言及相关SDK进行脚本开发,

JAVA语言程序设计课程设计报告模板及范文

设计题目:仿Windows画笔系统设计专业:计算机科学与技术 班级: 学号: 姓名: 2015 年7月

中文摘要 摘要:随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。 JAVA是一门很优秀的编程语言,具有面向对象、与平台无关、安全、稳定和多线程等特点,是目前软件设计中极为健壮的编程语言。JAVA不仅可以用来开发大型的应用程序。而且特别适合Internet的应用开发。JAVA确实具备“一次写成,处处运行”的特点,JAVA以成为网络时代最重要的编程语言之一。本报告中介绍了用JAVA语言实现画笔系统的全部过程。 本次课程设计是配合JAVA程序设计课程,帮助我们深入学习掌握JAVA语言,熟练运用这个工具来编写的。通过课程设计各个项目的综合训练,培养学生实际分析问题、编程和动手能力、提高学生的综合素质。本课程设计尝试使用一些较生动的示例和设计项目,激发学生学习兴趣,引导学生主动学习,正确理解、接受需要重点掌握的知识点,为参加项目开发及更深入学习做好准备。 本次课程设计主要是用JAVA实现画笔系统,其系统主要完成以下功能:设计一个画图程序,能够实现画笔、画直线、画圆形、画矩形的功能,并且在绘图。过程中能够修改该画笔的大小以及颜色。该画图程序还需具有橡皮擦功能以及清空整个画面的功能 关键词:画笔系统,JA V A

目录 中文摘要 (2) 目录 (3) 1.绪论 (4) 2. 开发环境介绍 (4) 3.需求分析 (5) 3.1总体目标 (5) 3.2要实现的功能 (6) 4.概要设计 (6) 4.1设计准备 (6) 4.2需用到的类 (7) 5.详细设计 (7) 5.1类的设计 (7) 5.2类的方法介绍 (8) 6.测试数据及运行结果 (10) 7.总结 (11) 8.参考文献 (11) 9.源程序 (12)

openMP实验总结报告

openMP实验报告 目录 openMP实验报告.............................................. 错误!未定义书签。 OpenMP简介.............................................. 错误!未定义书签。 实验一................................................... 错误!未定义书签。 实验二................................................... 错误!未定义书签。 实验三................................................... 错误!未定义书签。 实验四................................................... 错误!未定义书签。 实验五................................................... 错误!未定义书签。 实验六................................................... 错误!未定义书签。 实验七................................................... 错误!未定义书签。 实验八................................................... 错误!未定义书签。 实验总结................................................. 错误!未定义书签。 在学习了MPI之后,我们又继续学习了有关openMP的并行运算,通过老师的细致讲解,我们对openMP有了一个初步的了解: OpenMP简介 OpenMP是一种用于共享内存并行系统的多线程程序设计的库(Compiler Directive),特别适合于多核CPU上的并行程序开发设计。它支持的语言包括:C 语言、C++、Fortran;不过,用以上这些语言进行程序开发时,并非需要特别关注的地方,因为现如今的大多数编译器已经支持了OpenMP,例如:Sun Compiler,GNU Compiler、Intel Compiler、Visual Studio等等。程序员在编程时,只需要在特定的源代码片段的前面加入OpenMP专用的#pargma omp预编译指令,就可以“通知”编译器将该段程序自动进行并行化处理,并且在必要的时候加入线程同步及通信机制。当编译器选择忽略#pargma omp预处理指令时,或者编译器不支持OpenMP时,程序又退化为一般的通用串行程序,此时,代码

多线程总结

最近想将java基础的一些东西都整理整理,写下来,这是对知识的总结,也是一种乐趣。已经拟好了提纲,大概分为这几个主题: java线程安全,java垃圾收集,java并发包详细介绍,java profile和jvm性能调优。慢慢写吧。本人jameswxx原创文章,转载请注明出处,我费了很多心血,多谢了。关于java线程安全,网上有很多资料,我只想从自己的角度总结对这方面的考虑,有时候写东西是很痛苦的,知道一些东西,想用文字说清楚,却不是那么容易。我认为要认识 java线程安全,必须了解两个主要的点:java的内存模型,java的线程同步机制。特别是内存模型,java的线程同步机制很大程度上都是基于内存模型而设定的。从暂时写得比较仓促,后面会慢慢补充完善。 浅谈java内存模型 不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的。java的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非要控制多个线程对某个资源的有序访问或修改。java的内存模型,要解决两个主要的问题:可见性和有序性。我们都知道计算机有高速缓存的存在,处理器并不是每次处理数据都是取内存的。JVM定义了自己的内存模型,屏蔽了底层平台内存管理细节,对于java开发人员,要解决的是在jvm内存模型的基础上,如何解决多线程的可见性和有序性。 那么,何谓可见性?多个线程之间是不能互相传递数据通信的,它们之间的沟通只能通过共享变量来进行。Java内存模型(JMM)规定了jvm有主内存,主内存是多个线程共享的。当new一个对象的时候,也是被分配在主内存中,每个线程都有自己的工作内存,工作内存存储了主存的某些对象的副本,当然线程的工作内存大小是有限制的。当线程操作某个对象时,执行顺序如下: (1) 从主存复制变量到当前工作内存 (read and load) (2) 执行代码,改变共享变量值 (use and assign) (3) 用工作内存数据刷新主存相关内容 (store and write) JVM规范定义了线程对主存的操作指令:read,load,use,assign,store,write。当一个共享便变量在多个线程的工作内存中都有副本时,如果一个线程修改了这个共享变量,那么其他线程应该能够看到这个被修改后的值,这就是多线程的可见性问题。 那么,什么是有序性呢?线程在引用变量时不能直接从主内存中引用,如果线程工作内存中没有该变量,则会从主内存中拷贝一个副本到工作内存中,这个过程为read-load,完成后线程会引用该副本。当同一线程再度引用该字段时,有可能重新从主存中获取变量副本(read-load-use),也有可能直接引用原来的副本 (use),也就是说 read,load,use顺序可以由JVM实现系统决定。 线程不能直接为主存中中字段赋值,它会将值指定给工作内存中的变量副本(assign),完成后这个变量副本会同步到主存储区(store- write),至于何时同步过去,根据JVM实现系统决定.有该字段,则会从主内存中将该字段赋值到工作内存中,这个过程为read-load,完成后线程会引用该变量副本,当同一线程多次重复对字段赋值时,比如: for(int i=0;i<10;i++) a++; 线程有可能只对工作内存中的副本进行赋值,只到最后一次赋值后才同步到主存储区,所以assign,store,weite顺序可以由JVM实现系统决定。假设有一个共享变量x,线程a执行x=x+1。从上面的描述中可以知道x=x+1并不是一个原子操作,它的执行过程如下:

JAVA重点知识总结

CoreJava部分 1简述下java基本数据类型及所占位数,java基本数据类型:4类8种 整数类型:byte(1byte),short(2byte),int(4byte),long(8byte) 浮点类型:float(4byte),double(8byte) 字符类型:char(2byte) 逻辑类型:boolean(false/true1byte) 2说出5个启动时异常 ------RunTimeException ------NullPointerException ------ArrayIndexOutOfBoundsException ------ClassCastException ------NumberFormatException 3HashMap和HashTable的区别: 1HashMap允许空键值对,HashTable不允许 2HashMap不是线程安全的,HashTable是 3HashMap直接实现Map接口,HashTable继承Dictionary类 4.ArrayList,Vector,LinkedList存储性能和区别 它们都实现了List接口 ArrayList和Vector都是基于数组实现的 LinkedList基于双向循环链表(查找效率低,添加删除容易) ArrayList不是线程安全的而Vector是线程安全的,所有速度上ArrayList高于Vector 5.Collection和Collections的区别 Collection是集合类的上级接口,继承与他的接口主要有Set和List Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全等操作。 6List、Map、Set三个接口,存取元素时,各有什么特点? List以特定次序来持有元素,可有重复元素。 Set无法持有重复元素,内部排序 Map保存key-value值,value可多值。 7final,finally,finalize的区别 Final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承Finally是异常处理语句结构的一部分,表示总是执行 Finalize是Object类的一个方法,在垃圾收集时的其他资源回收,例如关闭文件等。8Overload和Override的区别。Overload的方法是否可以改变返回值的类型? 方法的重写Override和重载Overload是Java多态的不同表现。 重写Overriding是父类与子类之间多态的一种表现,方法名,参数列表返回值类型都得与父类的方法一致。 重载Overloading是一种类中多态的一种表现。重载的方法是可以改变返回值类型的。9用一句话总结一下冒泡排序 依次比较相邻的两个数,将小数放在前面,大数放在后面。 10实现线程安全的两种方式 1)synchronized方法:通过在方法声明加入synchronized关键字来声明synchronized方法

JAVA项目实验报告

JA V A课程项目报告 项目题目:利用JA V A实现一个小时钟的程序专业班级:10软件工程 学生姓名:闵楠 学生学号:E01014135

利用JAVA实现一个时钟的小程序 1.软件开发的需求分析 在当今的信息时代,时钟已经成为人们生活中必不可少的应用工具,Java语言是当今流行的网络编程语言,它具有面向对象、与平台无关、安全、多线程等特点。使用Java 语言不仅可以实现大型企业级的分布式应用系统,还能够为小型的、嵌入式设备进行应用程序的开发。面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承。为了进一步巩固课堂上所学到的知识,深刻把握Java 语言的重要概念及其面向对象的特性,锻炼我们熟练的应用面向对象的思想和设计方法解决实际问题的能力,开设了Java程序设计课程设计。 此次课程设计的题目为简单的小时钟程序设计,通过做巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、JCreator等开发工具的运用,拓宽常用类库的应用。使我们通过该教学环节与手段,把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。 2.具体实现 2.1设计思路 Java是一种简单的,面向对象的,分布式的,解释的,键壮的,安全的,结构中立的,可移植的,性能很优异的,多线程的,动态的语言。Java去掉了C++语言的许多功能,让Java的语言功能很精炼,并增加了一些很有用的功能,如自动收集碎片。这将减少平常出错的50%。而且,Java很小,整个解释器只需215K的RAM。 因此运用JAVA程序编写小时钟程序,实现简单显示时间的功能。本次课程设计做的是Java简单小时钟,它是图形界面、线程、流与文件等技术的综合应用,其界面主要采用了java.awt包,javax.swing包等。程序实现了小时钟的基本功能。 2.2设计方法 在设计简单小时钟时,需要编写5个Java源文件:Server.java、Objecting.java、LogIn.java、ClientUser.java、Client.java。 小时钟除了需要编写的上述5个Java源文件所给出的类外,还需要Java系统提供的一些重要的类,如JTextField、JTextArea和File类。

Java基础学习心得笔记

Java基础学习心得笔记 对于很多只会C语言的初学者而言,面对java基础语法学习,反而感觉很难,其实其中最大的问题不是语法难,而是一种编程思想的转变。面向过程就是把你的代码封装成函数,然后依次去做一件事情,面向过程是把你要做的事情抽象成对象,告诉对象去做。所以要想学好java入门,必须知道类和对象的概念。 类是对生活中事物的抽象描述,比如人类,动物类,交通工具类;对象即是对类的具体实例化,比如张三是人,猫是动物,飞机是交通工具(对象-----类)。Java基础入门学习路线可以总结为四步走: 1.java开发环境的搭建; 2.java初级之基础语法学习(80%类似C语言); 3.java中级之面向对象编程学习(重点); 4.java中级之应用编程学习。 第一步:JDK软件开发包时java软件开发环境, 包括jre运行环境和jvm虚拟机,在oricle官网下载javaSE版本JDK包;配置好环境变量就可以使用了。 第二步:java初级语法学习, 1.基本数据类型整形,字符型,字节型,长整形,短整形,浮点型,双精度,布尔型;

2.运算符+,-,*,/,%等; 3.控制流(while,switch,if else); 4.数组的定义方式。 此阶段基本无难度,只要了解练习例题。 第三步:java面向对象学习, 1.类和对象; 2.java语言三大特性,封装、继承、多态; 3.一些关键字学习(static,final,abstract,extends)等。 这是重点,大家根据知识点一步步研究学习才是关键。 第四步:java应用编程, 例如:文件IO,集合(类似C语言数据结构),异常处理,线程,网络,JDBC数据库操作等,都是掌握面向对象以后,在查找不同的类使用类中不同的方法达到应用的效果,所以并不会很难。等基础语法掌握了就可以继续后面框架学习(java web方向,android学习),相信明确思路你会豁然开朗,更有学习动力。 以上没有具体的实例和知识点讲解,分享的只是完全没接触过java的初学者自学java的思路和学习的流程,应该把握的重点,希望大家有所帮助。 如果你想学好Java,找一家靠谱的培训机构,能让你的学习事半功倍。

java学习整体总结

CoreJava部分 1 简述下java基本数据类型及所占位数,java基本数据类型:4类8种 整数类型:byte(1byte),short(2byte),int(4byte),long(8byte) 浮点类型:float(4byte),double(8byte) 字符类型:char(2byte) 逻辑类型:boolean(false/true 1byte) 2 说出5个启动时异常 RunTimeException ------NullPointerException ------ArrayIndexOutOfBoundsException ------ClassCastException ------NumberFormatException 3 HashMap 和HashTable的区别: 1HashMap 允许空键值对,HashTable不允许 2HashMap不是线程安全的,HashTable是 3HashMap直接实现Map接口,HashTable继承Dictionary类 4. ArrayList,Vector,LinkedList存储性能和区别 它们都实现了List接口 ArrayList和Vector都是基于数组实现的 LinkedList基于双向循环链表(查找效率低,添加删除容易) ArrayList不是线程安全的而Vector是线程安全的,所有速度上 ArrayList高于Vector 5. Collection和Collections的区别 Collection是集合类的上级接口,继承与他的接口主要有Set和List Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全等操作。 6 List、Map、Set三个接口,存取元素时,各有什么特点? List以特定次序来持有元素,可有重复元素。 Set 无法持有重复元素,内部排序 Map保存key-value值,value可多值。 7 final,finally,finalize的区别 Final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承 Finally 是异常处理语句结构的一部分,表示总是执行 Finalize 是Object类的一个方法,在垃圾收集时的其他资源回收,例如关闭文件等。 8 Overload和Override的区别。Overload的方法是否可以改变返回值的

编程学习心得和方法

编程学习心得和方法 )基于VB(https://www.360docs.net/doc/8810603728.html,),JSP基于JAVA。 现今已经发展出各种各样的编程语言,并且,它们大多采用了英文编写,单是关键字和标准类库就要我们花时间去记忆和识别,最后,还得去灵活运用更多的东西。所以,我们想一次性学习它们,这是不可能的事情,尽管大多语言很相似,你也不可能做到的。事实上,很少有人能够学习全部,大多都只能擅长某一种。 即便是高级编程人员,像那些为开发软件工作的类库和组件高手,他们也不敢说自己精通每一种语言。事实就是这样,每一种语言有着它们相似而又不同的语法,它们有着不同的关键字,发展出了各种各样的类库,它们的函数或者方法的声明定义都有不同,更多的差异不为我们所知。 每一种语言,它都有着太多的东西需要我们去理解和记忆,我们没有时间和精力做得太多。对于初学者,我们最不应该急于求成,更不要试图一次性学习所有语言。事实上,我们可以选取某种语言学习。每一种语言都有着自己的强大功能,好的语言能够完成所有事情,所以,你不要担心学习一种语言不够全面这样的问题。 当你能够得心应手掌控你学习的一种语言后,你回过头来再去学习其他语言时,你可能会发现,原来,这些语言是那么的相近。这个时候,你再去学习它们,我想,那真是很愉快的事情,大概,那个时候,你会笑出声来。 我们知道,从某种意义来说,各种语言都有很多类似的地方,这大概是因为所有的语言开发都是基于已有语言创造的,开发者也出于对大家的尊重,考虑到易于学习等等原因,他们选择了几乎是相同的语法来定义这些新语言。可以说,所有语言都是基于已有语言开发的,没有人能够聪明到突发其想,更不可能一夜之间发明出一种完全不同的外星语。 基于语言再开发语言,这么做能给使用者带来了一次学习,全部学会的好处。当然,最大的好处莫过于新的语言肯定比之前的语言更加好用简单,功能也更全面强大。某种意义上讲,开发新的语言就是在更新旧语言的错误和不足,最后发展出新语言。 其实,每一种语言的区别大多只在于关键字的区别,还有一些语法上的区别。事实就是这样,很多语言之所以不同,就因为它们的关键字不同。就像你吃饭一样,中国人用筷子,外国人却不是。这些都没有改变吃饭的实质,我们都能完成一样的事情,那就是吃饭。

相关文档
最新文档