總結(jié)不僅僅是總結(jié)成績(jī),更重要的是為了研究經(jīng)驗(yàn),發(fā)現(xiàn)做好工作的規(guī)律,也可以找出工作失誤的教訓(xùn)。這些經(jīng)驗(yàn)教訓(xùn)是非常寶貴的,對(duì)工作有很好的借鑒與指導(dǎo)作用,在今后工作中可以改進(jìn)提高,趨利避害,避免失誤。寫(xiě)總結(jié)的時(shí)候需要注意什么呢?有哪些格式需要注意呢?下面是小編為大家?guī)?lái)的總結(jié)書(shū)優(yōu)秀范文,希望大家可以喜歡。
java線程知識(shí)點(diǎn)總結(jié) java線程寫(xiě)法篇一
計(jì)算器
班級(jí):****** 姓名:******
學(xué)號(hào): ******* 指導(dǎo)老師:******
實(shí)驗(yàn)名稱(chēng):java計(jì)算器
1實(shí)驗(yàn)?zāi)康? java編程語(yǔ)言在編程方面的具體應(yīng)用,以及使用面向?qū)ο蠓椒?對(duì)小應(yīng)用程序進(jìn)行需求分
析、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì),最后使用java編程實(shí)現(xiàn)的全過(guò)程。
2實(shí)驗(yàn)意義:
在編程我們使用的java語(yǔ)言,是目前比較流行的編程語(yǔ)言。在當(dāng)今這個(gè)時(shí)代,java語(yǔ)言在編程方面的優(yōu)勢(shì)使得編程有了更好的選擇。java語(yǔ)言最大的特點(diǎn)是具有跨平臺(tái)性,使其不受平臺(tái)不同的影響,得到了廣泛的應(yīng)用。實(shí)訓(xùn)性質(zhì)
本課程是計(jì)算機(jī)信息管理專(zhuān)業(yè)的一門(mén)實(shí)踐性課程,是《java編程》課程的實(shí)踐性教學(xué)環(huán)節(jié)。實(shí)訓(xùn)目標(biāo)
⑴綜合應(yīng)用java程序設(shè)計(jì)的知識(shí)解決實(shí)際問(wèn)題。
⑵學(xué)會(huì)在應(yīng)用程序的設(shè)計(jì)過(guò)程中,應(yīng)用面向?qū)ο蟮某绦蛟O(shè)計(jì)方法。⑶學(xué)會(huì)應(yīng)用jdbc創(chuàng)建數(shù)據(jù)庫(kù)應(yīng)用程序。
⑷學(xué)會(huì)開(kāi)發(fā)基于swing的應(yīng)用程序及多文檔應(yīng)用程序的設(shè)計(jì)。實(shí)訓(xùn)任務(wù)
用java語(yǔ)言開(kāi)發(fā)工具(例如jdk、jcreator、netbeans等)制作一個(gè)簡(jiǎn)單的可運(yùn)行的完整的應(yīng)用程序或小型系統(tǒng),并編制出各階段必要的文檔。
將創(chuàng)建一個(gè)計(jì)算器,可以進(jìn)行常用的加減乘除算術(shù)運(yùn)算。本實(shí)例的知識(shí)點(diǎn)有:窗口布局器gridlayout的應(yīng)用,對(duì)按鈕消息的監(jiān)聽(tīng)和響應(yīng)。
6實(shí)訓(xùn)條件
<軟件:>windows xp,netbeans ide 6.52 7開(kāi)發(fā)背景: java是由sun microsystems公司于1995年5月推出的java程序設(shè)計(jì)語(yǔ)言(以下簡(jiǎn)稱(chēng)java語(yǔ)言)和java平臺(tái)的總稱(chēng)。java語(yǔ)言是一個(gè)支持網(wǎng)絡(luò)計(jì)算的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言。java語(yǔ)言吸收了smalltalk語(yǔ)言和c++語(yǔ)言的優(yōu)點(diǎn),并增加了其它特性,如支持并發(fā)程序設(shè)計(jì)、網(wǎng)絡(luò)通信、和多媒體數(shù)據(jù)控制等。
8系統(tǒng)部分分析:
1)java語(yǔ)言是簡(jiǎn)單的。java語(yǔ)言的語(yǔ)法與c語(yǔ)言和c++語(yǔ)言很接近,使得大多數(shù)程序員很容易學(xué)習(xí)和使用java。另一方面,java丟棄了c++ 中很少使用的、很難理解的、令人迷惑的那些特性,如操作符重載、多繼承、自動(dòng)的強(qiáng)制類(lèi)型轉(zhuǎn)換。
2)java語(yǔ)言是一個(gè)面向?qū)ο蟮?。java語(yǔ)言提供類(lèi)、接口和繼承等原語(yǔ),為了簡(jiǎn)單起見(jiàn),只支持類(lèi)之間的單繼承,但支持接口之間的多繼承,并支持類(lèi)與接口之間的實(shí)現(xiàn)機(jī)制(關(guān)鍵字為implements)。java語(yǔ)言全面支持動(dòng)態(tài)綁定,而c++ 語(yǔ)言只對(duì)虛函數(shù)使用動(dòng)態(tài)綁定
3)java語(yǔ)言是分布式的。java語(yǔ)言支持internet應(yīng)用的開(kāi)發(fā),在基本的java應(yīng)用編程接口中有一個(gè)網(wǎng)絡(luò)應(yīng)用編程接口(),它提供了用于網(wǎng)絡(luò)應(yīng)用編程的類(lèi)庫(kù),包括url、urlconnection、socket、serversocket等。java的rmi(遠(yuǎn)程方法激活)機(jī)制也是開(kāi)發(fā)分布式應(yīng)用的重要手段。
4)java語(yǔ)言是健壯的。java的強(qiáng)類(lèi)型機(jī)制、異常處理、廢料的自動(dòng)收集等是java程序健壯性的重要保證。對(duì)指針的丟棄是java的明智選擇。java的安全檢查機(jī)制使得java更具健壯性。
5)java語(yǔ)言是安全的。java通常被用在網(wǎng)絡(luò)環(huán)境中,為此,java提供了一個(gè)安全機(jī)制以防惡意代碼的攻擊。除了java語(yǔ)言具有的許多安全特性以外,java對(duì)通過(guò)網(wǎng)絡(luò)下載的類(lèi)具有一個(gè)安全防范機(jī)制(類(lèi)classloader),如分配不同的名字空間以防替代本地的同名類(lèi)、字節(jié)代碼檢查,并提供安全管理機(jī)制.6)java語(yǔ)言是體系結(jié)構(gòu)中立的。java程序(后綴為java的文件)在java平臺(tái)上被編譯為體系結(jié)構(gòu)中立的字節(jié)碼格式(后綴為class的文件), 然后可以在實(shí)現(xiàn)這個(gè)java平臺(tái)的任何系統(tǒng)中運(yùn)行。
7)java語(yǔ)言是可移植的。這種可移植性來(lái)源于體系結(jié)構(gòu)中立性,另外,java還嚴(yán)格規(guī)定了各個(gè)基本數(shù)據(jù)類(lèi)型的長(zhǎng)度。java系統(tǒng)本身也具有很強(qiáng)的可移植性,java編譯器是用java實(shí)現(xiàn)的.8)java語(yǔ)言是解釋型的。如前所述,java程序在java平臺(tái)上被編譯為字節(jié)碼格式,然后可以在實(shí)現(xiàn)這個(gè)java平臺(tái)的任何系統(tǒng)中運(yùn)行。
9)java是高性能的。與那些解釋型的高級(jí)腳本語(yǔ)言相比,java的確是高性能的。事實(shí)上,java的運(yùn)行速度隨著jit(just-in-time)編譯器技術(shù)的發(fā)展越來(lái)越接近于c++。
10)java語(yǔ)言是多線程的。在java語(yǔ)言中,線程是一種特殊的對(duì)象,它必須由thread類(lèi)或其子(孫)類(lèi)來(lái)創(chuàng)建。
11)java語(yǔ)言是動(dòng)態(tài)的。java語(yǔ)言的設(shè)計(jì)目標(biāo)之一是適應(yīng)于動(dòng)態(tài)變化的環(huán)境。
目錄
課程設(shè)計(jì)題目 ……………………………… p1
課程設(shè)計(jì)簡(jiǎn)介 ……………………………… p2
課程設(shè)計(jì)源代碼…………………………… p5
課程設(shè)計(jì)運(yùn)行結(jié)果 ……………………… p15 課程設(shè)計(jì)心得體會(huì) ………………………
p16
package computerpad;import .*;import .event.*;import .*;import .*;import list;import format;public class computerpad extends frame implements actionlistener {
numberbutton numberbutton[];
operationbutton oprationbutton[];
button 小數(shù)點(diǎn)按鈕,正負(fù)號(hào)按鈕,退格按鈕,求倒數(shù)按鈕,等號(hào)按鈕,清零按鈕;
panel panel;
jtextfield resultshow;
string 運(yùn)算符號(hào)[]={“+”,“-”,“*”,“/”};
linkedlist 鏈表;
boolean 是否按下等號(hào)=false;
public computerpad()
{
super(“計(jì)算器”);
鏈表=new linkedlist();
numberbutton=new numberbutton[10];
for(int i=0;i<=9;i++)
{
numberbutton[i]=new numberbutton(i);
numberbutton[i].addactionlistener(this);
}
oprationbutton=new operationbutton[4];
for(int i=0;i<4;i++)
{
oprationbutton[i]=new operationbutton(運(yùn)算符號(hào)[i]);
oprationbutton[i].addactionlistener(this);
}
小數(shù)點(diǎn)按鈕=new button(“.”);
正負(fù)號(hào)按鈕
=new button(“+/-”);
等號(hào)按鈕=new button(“=”);
求倒數(shù)按鈕=new button(“1/x”);
退格按鈕=new button(“退格”);
清零按鈕=new button(“c”);
eground();
eground();
eground();
eground();
eground();
eground();
ionlistener(this);
ionlistener(this);
ionlistener(this);
ionlistener(this);
ionlistener(this);
ionlistener(this);
resultshow=new jtextfield(10);
izontalalignment();
eground();
t(new font(“timesroman”,,14));
der(new softbevelborder(d));
kground();
table(false);
panel=new panel();
out(new gridlayout(4,5));
(numberbutton[1]);
(numberbutton[2]);
(numberbutton[3]);
(oprationbutton[0]);
(清零按鈕);
(numberbutton[4]);
(numberbutton[5]);
(numberbutton[6]);
(oprationbutton[1]);
(退格按鈕);
(numberbutton[7]);
(numberbutton[8]);
(numberbutton[9]);
(oprationbutton[2]);
(求倒數(shù)按鈕);
(numberbutton[0]);
(正負(fù)號(hào)按鈕);
(小數(shù)點(diǎn)按鈕);
(oprationbutton[3]);
(等號(hào)按鈕);
add(panel,);
add(resultshow,);
addwindowlistener(new windowadapter()
{ public void windowclosing(windowevent e)
{
(0);
}
});
setvisible(true);
setbounds(100,50,240,180);
setresizable(false);
validate();
} public void actionperformed(actionevent e)
{
if(rce()instanceof numberbutton)
{
numberbutton b=(numberbutton)rce();
if(()==0)
{
int number=ber();
(“"+number);
t(”“+number);
是否按下等號(hào)=false;
}
else if(()==1&&是否按下等號(hào)==false)
{
int number=ber();
string num=(string)first();
string s=(”“+number);
(0,s);
t(s);
}
else if(()==1&&是否按下等號(hào)==true)
{
int number=ber();
first();
(”“+number);
是否按下等號(hào)=false;
t(”“+number);
}
else if(()==2)
{
int number=ber();
(”“+number);
t(”“+number);
}
else if(()==3)
{
int number=ber();
string num=(string)t();
string s=(”“+number);
(2,s);
t(s);
}
}
else if(rce()instanceof operationbutton)
{
operationbutton b=(operationbutton)rce();
if(()==1)
{
string fuhao=運(yùn)算符號(hào)();
(fuhao);
}
else if(()==2)
{
string fuhao=運(yùn)算符號(hào)();
(1,fuhao);
}
else if(()==3)
{
string fuhao=運(yùn)算符號(hào)();
string number1=(string)first();
string number2=(string)t();
string 運(yùn)算符號(hào)=(string)(1);
try
{
double n1=ouble(number1);
double n2=ouble(number2);
double n=0;
if((”+“))
{
n=n1+n2;
}
else if((”-“))
{
n=n1-n2;
}
else if((”*“))
{
n=n1*n2;
}
else if((”/“))
{
n=n1/n2;
}
();
(”“+n);
(fuhao);
t(”“+n);
}
catch(exception ee)
{
}
}
}
else if(rce()==等號(hào)按鈕)
{
是否按下等號(hào)=true;
if(()==1||()==2)
{
string num=(string)first();
t(”“+num);
}
else if(()==3)
{
string number1=(string)first();
string number2=(string)t();
string 運(yùn)算符號(hào)=(string)(1);
try
{
double n1=ouble(number1);
double n2=ouble(number2);
double n=0;
if((”+“))
{
n=n1+n2;
}
else if((”-“))
{
n=n1-n2;
}
else if((”*“))
{
n=n1*n2;
}
else if((”/“))
{
n=n1/n2;
}
t(”“+n);
(0,”“+n);
last();
last();
}
catch(exception ee)
{
}
}
}
else if(rce()==小數(shù)點(diǎn)按鈕)
{
if(()==0)
{
是否按下等號(hào)=false;
}
else if(()==1)
{
string dot=el();
string num=(string)first();
string s=null;
if(f(dot)==-1)
{
s=(dot);
(0,s);
}
else
{
s=num;
}
(0,s);
t(s);
}
else if(()==3)
{
string dot=el();
string num=(string)t();
string s=null;
if(f(dot)==-1)
{
s=(dot);
(2,s);
}
else
{
s=num;
}
t(s);
}
}
else if(rce()==退格按鈕)
{
if(()==1)
{
string num=(string)first();
if(()>=1)
{
num=ing(0,()-1);
(0,num);
t(num);
}
else
{
last();
t(”0“);
}
}
else if(()==3)
{
string num=(string)t();
if(()>=1)
{ num=ing(0,()-1);
(2,num);
t(num);
}
else
{
last();
t(”0“);
}
}
}
else if(rce()==正負(fù)號(hào)按鈕)
{
if(()==1)
{
string number1=(string)first();
try
{
double d=ouble(number1);
d=-1*d;
string str=f(d);
(0,str);
t(str);
}
catch(exception ee)
{
}
}
else if(()==3)
{
string number2=(string)t();
try
{
double d=ouble(number2);
d=-1*d;
string str=f(d);
(2,str);
t(str);
}
catch(exception ee){
}
}
}
else if(rce()==求倒數(shù)按鈕)
{
if(()==1||()==2)
{
string number1=(string)first();
try
{
double d=ouble(number1);
d=1.0/d;
string str=f(d);
(0,str);
t(str);
}
catch(exception ee){
}
}
else if(()==3)
{
string number2=(string)t();
try
{
double d=ouble(number2);
d=1.0/d;
string str=f(d);
(0,str);
t(str);
}
catch(exception ee){
}
}
}
else if(rce()==清零按鈕)
{
是否按下等號(hào)=false;
t(”0“);
();
}
} public static void main(string args[])
{
new computerpad();
}
}
package computerpad;import .*;import .event.*;import .*;public class numberbutton extends button {
int number;
public numberbutton(int number)
{
super(”"+number);
=number;
setforeground();
}
public int getnumber()
{
return number;
} }
import .*;import .event.*;import .*;public class operationbutton extends button {
string 運(yùn)算符號(hào);
public operationbutton(string s)
{
super(s);
運(yùn)算符號(hào)=s;
setforeground();
}
public string get運(yùn)算符號(hào)()
{
return 運(yùn)算符號(hào);
} } 14 java實(shí)訓(xùn)心得:
未接觸java之前,聽(tīng)人說(shuō)java這門(mén)語(yǔ)言如何的強(qiáng)大和難以入門(mén),但學(xué)習(xí)之后,給我的感覺(jué)卻是語(yǔ)言沒(méi)有所謂的難于不難,關(guān)鍵是自己有沒(méi)有真正投入去學(xué),有沒(méi)有花時(shí)間去學(xué)。java是一門(mén)很好的語(yǔ)言,經(jīng)過(guò)周?chē)藢?duì)java的宣傳,我一開(kāi)始不敢去學(xué)習(xí)這門(mén)語(yǔ)言,因?yàn)橐婚T(mén)高級(jí)語(yǔ)言總是讓人想到一開(kāi)始的學(xué)習(xí)會(huì)很難,但是后來(lái)在自己的努力和老師同學(xué)的幫助下,我加入了java學(xué)習(xí)者的行列。
老師把我們帶進(jìn)了門(mén),那么,以后漫長(zhǎng)的深入學(xué)習(xí)還是要靠自己。經(jīng)常性的編寫(xiě)一些程序,或則去看懂、研究透別人編寫(xiě)的程序?qū)τ谖覀兇蚝没A(chǔ)是非常有利的。讓我們懷著對(duì)java的一腔熱情,用自己的刻苦努力去把java學(xué)好。將來(lái),用自己的成績(jī)?nèi)セ貓?bào)有恩于我們的社會(huì)、家人和朋友。
java線程知識(shí)點(diǎn)總結(jié) java線程寫(xiě)法篇二
線程編程方面
60、java中有幾種方法可以實(shí)現(xiàn)一個(gè)線程?用什么關(guān)鍵字修飾同步方法? stop()和suspend()方法為何不推薦使用?
答:有兩種實(shí)現(xiàn)方法,分別是繼承thread類(lèi)與實(shí)現(xiàn)runnable接口 用synchronized關(guān)鍵字修飾同步方法
反對(duì)使用stop(),是因?yàn)樗话踩K鼤?huì)解除由線程獲取的所有鎖定,而且如果對(duì)象處于一種不連貫狀態(tài),那么其他線程能在那種狀態(tài)下檢查和修改它們。結(jié)果很難檢查出真正的問(wèn)題所在。suspend()方法容易發(fā)生死鎖。調(diào)用suspend()的時(shí)候,目標(biāo)線程會(huì)停下來(lái),但卻仍然持有在這之前獲得的鎖定。此時(shí),其他任何線程都不能訪問(wèn)鎖定的資源,除非被“掛起”的線程恢復(fù)運(yùn)行。對(duì)任何線程來(lái)說(shuō),如果它們想恢復(fù)目標(biāo)線程,同時(shí)又試圖使用任何一個(gè)鎖定的資源,就會(huì)造成死鎖。所以不應(yīng)該使用suspend(),而應(yīng)在自己的thread類(lèi)中置入一個(gè)標(biāo)志,指出線程應(yīng)該活動(dòng)還是掛起。若標(biāo)志指出線程應(yīng)該掛起,便用wait()命其進(jìn)入等待狀態(tài)。若標(biāo)志指出線程應(yīng)當(dāng)恢復(fù),則用一個(gè)notify()重新啟動(dòng)線程。61、sleep()和 wait()有什么區(qū)別? 答:sleep是線程類(lèi)(thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時(shí)間,給執(zhí)行機(jī)會(huì)給其他線程,但是監(jiān)控狀態(tài)依然保持,到時(shí)后會(huì)自動(dòng)恢復(fù)。調(diào)用sleep不會(huì)釋放對(duì)象鎖。
wait是object類(lèi)的方法,對(duì)此對(duì)象調(diào)用wait方法導(dǎo)致本線程放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象發(fā)出notify方法(或notifyall)后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲得對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。
62、同步和異步有何異同,在什么情況下分別使用他們?舉例說(shuō)明。
答:如果數(shù)據(jù)將在線程間共享。例如正在寫(xiě)的數(shù)據(jù)以后可能被另一個(gè)線程讀到,或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個(gè)線程寫(xiě)過(guò)了,那么這些數(shù)據(jù)就是共享數(shù)據(jù),必須進(jìn)行同步存取。
當(dāng)應(yīng)用程序在對(duì)象上調(diào)用了一個(gè)需要花費(fèi)很長(zhǎng)時(shí)間來(lái)執(zhí)行的方法,并且不希望讓程序等待方法的返回時(shí),就應(yīng)該使用異步編程,在很多情況下采用異步途徑往往更有效率。63、啟動(dòng)一個(gè)線程是用run()還是start()? 答:?jiǎn)?dòng)一個(gè)線程是調(diào)用start()方法,使線程所代表的虛擬處理機(jī)處于可運(yùn)行狀態(tài),這意味著它可以由jvm調(diào)度并執(zhí)行。這并不意味著線程就會(huì)立即運(yùn)行。run()方法可以產(chǎn)生必須退出的標(biāo)志來(lái)停止一個(gè)線程。
64、當(dāng)一個(gè)線程進(jìn)入一個(gè)對(duì)象的一個(gè)synchronized方法后,其它線程是否可進(jìn)入此對(duì)象的其它方法? 答:不能,一個(gè)對(duì)象的一個(gè)synchronized方法只能由一個(gè)線程訪問(wèn)。
我認(rèn)為:其他線程可以進(jìn)入非synchronized方法,但不能進(jìn)入這個(gè)對(duì)象的synchronized方法。65、請(qǐng)說(shuō)出你所知道的線程同步的方法。
答:wait():使一個(gè)線程處于等待狀態(tài),并且釋放所持有的對(duì)象的lock。
sleep():使一個(gè)正在運(yùn)行的線程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法,調(diào)用此方法要捕捉interruptedexception異常。
notify():喚醒一個(gè)處于等待狀態(tài)的線程,注意的是在調(diào)用此方法的時(shí)候,并不能確切的喚醒某一個(gè)等待狀態(tài)的線程,而是由jvm確定喚醒哪個(gè)線程,而且不是按優(yōu)先級(jí)。
allnotity():喚醒所有處入等待狀態(tài)的線程,注意并不是給所有喚醒線程一個(gè)對(duì)象的鎖,而是讓它們競(jìng)爭(zhēng)。
66、多線程有幾種實(shí)現(xiàn)方法,都是什么?同步有幾種實(shí)現(xiàn)方法,都是什么? 答:多線程有兩種實(shí)現(xiàn)方法,分別是繼承thread類(lèi)與實(shí)現(xiàn)runnable接口 同步的實(shí)現(xiàn)方面有兩種,分別是synchronized,wait與notify 67、線程的基本概念、線程的基本狀態(tài)以及狀態(tài)之間的關(guān)系
答:線程指在程序執(zhí)行過(guò)程中,能夠執(zhí)行程序代碼的一個(gè)執(zhí)行單位,每個(gè)程序至少都有一個(gè)線程,也就是程序本身。
java中的線程有四種狀態(tài)分別是:運(yùn)行、就緒、掛起、結(jié)束
68、的異同 ? 答:主要相同點(diǎn):lock能完成synchronized所實(shí)現(xiàn)的所有功能
主要不同點(diǎn):lock有比synchronized更精確的線程語(yǔ)義和更好的性能。synchronized會(huì)自動(dòng)釋放鎖,而lock一定要求程序員手工釋放,并且必須在finally從句中釋放。
jsp方面
69、forward 和redirect的區(qū)別
答:forward是服務(wù)器請(qǐng)求資源,服務(wù)器直接訪問(wèn)目標(biāo)地址的url,把那個(gè)url的響應(yīng)內(nèi)容讀取過(guò)來(lái),然后把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容是從哪兒來(lái)的,所以它的地址欄中還是原來(lái)的地址。
redirect就是服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請(qǐng)求那個(gè)地址,一般來(lái)說(shuō)瀏覽器會(huì)用剛才請(qǐng)求的所有參數(shù)重新請(qǐng)求,所以session,request參數(shù)都可以獲取。70、jsp有哪些內(nèi)置對(duì)象?作用分別是什么?
答:jsp共有以下9種基本內(nèi)置組件(可與asp的6種內(nèi)部組件相對(duì)應(yīng)):
request 用戶(hù)端請(qǐng)求,此請(qǐng)求會(huì)包含來(lái)自get/post請(qǐng)求的參數(shù)
response 網(wǎng)頁(yè)傳回用戶(hù)端的回應(yīng)
pagecontext 網(wǎng)頁(yè)的屬性是在這里管理
session 與請(qǐng)求有關(guān)的會(huì)話期
application servlet 正在執(zhí)行的內(nèi)容
out 用來(lái)傳送回應(yīng)的輸出 config servlet的構(gòu)架部件
page jsp網(wǎng)頁(yè)本身
exception 針對(duì)錯(cuò)誤網(wǎng)頁(yè),未捕捉的例外
71、jsp有哪些動(dòng)作?作用分別是什么? 答:jsp共有以下6種基本動(dòng)作
jsp:include:在頁(yè)面被請(qǐng)求的時(shí)候引入一個(gè)文件。
jsp:usebean:尋找或者實(shí)例化一個(gè)javabean。
jsp:setproperty:設(shè)置javabean的屬性。
jsp:getproperty:輸出某個(gè)javabean的屬性。
jsp:forward:把請(qǐng)求轉(zhuǎn)到一個(gè)新的頁(yè)面。
jsp:plugin:根據(jù)瀏覽器類(lèi)型為java插件生成object或embed標(biāo)記 72、jsp中動(dòng)態(tài)include與靜態(tài)include的區(qū)別?
答:動(dòng)態(tài)include用jsp:include動(dòng)作實(shí)現(xiàn)
它總是會(huì)檢查所含文件中的變化,適合用于包含動(dòng)態(tài)頁(yè)面,并且可以帶參數(shù)靜態(tài)include用include偽碼實(shí)現(xiàn),定不會(huì)檢查所含文件的變化,適用于包含靜態(tài)頁(yè)面
<%@ include file=“” %> 73、兩種跳轉(zhuǎn)方式分別是什么?有什么區(qū)別? 答:有兩種,分別為:
前者頁(yè)面不會(huì)轉(zhuǎn)向include所指的頁(yè)面,只是顯示該頁(yè)的結(jié)果,主頁(yè)面還是原來(lái)的頁(yè)面。執(zhí)行完后還會(huì)回來(lái),相當(dāng)于函數(shù)調(diào)用。并且可以帶參數(shù).后者完全轉(zhuǎn)向新頁(yè)面,不會(huì)再回來(lái)。相當(dāng)于go to 語(yǔ)句。
74、jsp的內(nèi)置對(duì)象及方法。答:request表示httpservletrequest對(duì)象。它包含了有關(guān)瀏覽器請(qǐng)求的信息,并且提供了幾個(gè)用于獲取cookie, header, 和session數(shù)據(jù)的有用的方法。
response表示httpservletresponse對(duì)象,并提供了幾個(gè)用于設(shè)置送回 瀏覽器的響應(yīng)的方法(如cookies,頭信息等)
ter的一個(gè)實(shí)例,并提供了幾個(gè)方法使你能用于向?yàn)g覽器回送輸出結(jié)果。
ntext對(duì)象。它是用于方便存取各種范圍的名字空間、servlet相關(guān)的對(duì)象的api,并且包裝了通用的servlet相關(guān)功能的方法。
ssion對(duì)象。session可以存貯用戶(hù)的狀態(tài)信息
applicaton tcontext對(duì)象。這有助于查找有關(guān)servlet引擎和servlet環(huán)境的信息
tconfig對(duì)象。該對(duì)象用于存取servlet實(shí)例的初始化參數(shù)。page表示從該頁(yè)面產(chǎn)生的一個(gè)servlet實(shí)例
servlet方面
75、說(shuō)一說(shuō)servlet的生命周期?
答:servlet有良好的生存期的定義,包括加載和實(shí)例化、初始化、處理請(qǐng)求以及服務(wù)結(jié)束。t接口的init,service和destroy方法表達(dá)。servlet被服務(wù)器實(shí)例化后,容器運(yùn)行其init方法,請(qǐng)求到達(dá)時(shí)運(yùn)行其service方法,service方法自動(dòng)派遣運(yùn)行與請(qǐng)求對(duì)應(yīng)的doxxx方法(doget,dopost)等,當(dāng)服務(wù)器決定將實(shí)例銷(xiāo)毀的時(shí)候調(diào)用其destroy方法。
與cgi的區(qū)別在于servlet處于服務(wù)器進(jìn)程中,它通過(guò)多線程方式運(yùn)行其service方法,一個(gè)實(shí)例可以服務(wù)于多個(gè)請(qǐng)求,并且其實(shí)例一般不會(huì)銷(xiāo)毀,而cgi對(duì)每個(gè)請(qǐng)求都產(chǎn)生新的進(jìn)程,服務(wù)完成后就銷(xiāo)毀,所以效率上低于servlet。
76、java servlet api中forward()與redirect()的區(qū)別?
答:前者僅是容器中控制權(quán)的轉(zhuǎn)向,在客戶(hù)端瀏覽器地址欄中不會(huì)顯示出轉(zhuǎn)向后的地址;后者則是完全的跳轉(zhuǎn),瀏覽器將會(huì)得到跳轉(zhuǎn)的地址,并重新發(fā)送請(qǐng)求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址。所以,前者更加高效,在前者可以滿(mǎn)足需要時(shí),盡量使用forward()方法,并且,這樣也有助于隱藏實(shí)際的鏈接。在有些情況下,比如,需要跳轉(zhuǎn)到一個(gè)其它服務(wù)器上的資源,則必須使用sendredirect()方法。77、servlet的基本架構(gòu) 答:
public class servletname extends httpservlet { public void dopost(httpservletrequest request, httpservletresponse response)throws servletexception, ioexception { } public void doget(httpservletrequest request, httpservletresponse response)throws servletexception, ioexception { } }
78、什么情況下調(diào)用doget()和dopost()?
答:jsp頁(yè)面中的form標(biāo)簽里的method屬性為get時(shí)調(diào)用doget(),為post時(shí)調(diào)用dopost()。79、servlet的生命周期
答:web容器加載servlet,生命周期開(kāi)始。通過(guò)調(diào)用servlet的init()方法進(jìn)行servlet的初始化。通過(guò)調(diào)用service()方法實(shí)現(xiàn),根據(jù)請(qǐng)求的不同調(diào)用不同的do***()方法。結(jié)束服務(wù),web容器調(diào)用servlet的destroy()方法。
80、如何現(xiàn)實(shí)servlet的單線程模式 答:<%@ page isthreadsafe=“false”%> 81、頁(yè)面間對(duì)象傳遞的方法
答:request,session,application,cookie等
82、jsp和servlet有哪些相同點(diǎn)和不同點(diǎn),他們之間的聯(lián)系是什么?
答:jsp是servlet技術(shù)的擴(kuò)展,本質(zhì)上是servlet的簡(jiǎn)易方式,更強(qiáng)調(diào)應(yīng)用的外表表達(dá)。jsp編譯后是“類(lèi)servlet”。servlet和jsp最主要的不同點(diǎn)在于,servlet的應(yīng)用邏輯是在java文件中,并且完全從表示層中的html里分離開(kāi)來(lái)。的文件。jsp側(cè)重于視圖,servlet主要用于控制邏輯。83、四種會(huì)話跟蹤技術(shù)
答:會(huì)話作用域servletsjsp 頁(yè)面描述
page否是代表與一個(gè)頁(yè)面相關(guān)的對(duì)象和屬性。一個(gè)頁(yè)面由一個(gè)編譯好的 java servlet 類(lèi)(可以帶有任何的 include 指令,但是沒(méi)有 include 動(dòng)作)表示。這既包括 servlet 又包括被編譯成 servlet 的 jsp 頁(yè)面
request是是代表與 web 客戶(hù)機(jī)發(fā)出的一個(gè)請(qǐng)求相關(guān)的對(duì)象和屬性。一個(gè)請(qǐng)求可能跨越多個(gè)頁(yè)面,涉及多個(gè) web 組件(由于 forward 指令和 include 動(dòng)作的關(guān)系)
session是是代表與用于某個(gè) web 客戶(hù)機(jī)的一個(gè)用戶(hù)體驗(yàn)相關(guān)的對(duì)象和屬性。一個(gè) web 會(huì)話可以也經(jīng)常會(huì)跨越多個(gè)客戶(hù)機(jī)請(qǐng)求
application是是代表與整個(gè) web 應(yīng)用程序相關(guān)的對(duì)象和屬性。這實(shí)質(zhì)上是跨越整個(gè) web 應(yīng)用程序,包括多個(gè)頁(yè)面、請(qǐng)求和會(huì)話的一個(gè)全局作用域 84、request對(duì)象的主要方法 答:
setattribute(string name,object):設(shè)置名字為name的request的參數(shù)值 getattribute(string name):返回由name指定的屬性值
getattributenames():返回request對(duì)象所有屬性的名字集合,結(jié)果是一個(gè)枚舉的實(shí)例 getcookies():返回客戶(hù)端的所有cookie對(duì)象,結(jié)果是一個(gè)cookie數(shù)組 getcharacterencoding():返回請(qǐng)求中的字符編碼方式 getcontentlength():返回請(qǐng)求的body的長(zhǎng)度
getheader(string name):獲得http協(xié)議定義的文件頭信息 getheaders(string name):返回指定名字的request header的所有值,結(jié)果是一個(gè)枚舉的實(shí)例 getheadernames():返回所以request header的名字,結(jié)果是一個(gè)枚舉的實(shí)例 getinputstream():返回請(qǐng)求的輸入流,用于獲得請(qǐng)求中的數(shù)據(jù) getmethod():獲得客戶(hù)端向服務(wù)器端傳送數(shù)據(jù)的方法
getparameter(string name):獲得客戶(hù)端傳送給服務(wù)器端的有name指定的參數(shù)值
getparameternames():獲得客戶(hù)端傳送給服務(wù)器端的所有參數(shù)的名字,結(jié)果是一個(gè)枚舉的實(shí)例 getparametervalues(string name):獲得有name指定的參數(shù)的所有值 getprotocol():獲取客戶(hù)端向服務(wù)器端傳送數(shù)據(jù)所依據(jù)的協(xié)議名稱(chēng) getquerystring():獲得查詢(xún)字符串
getrequesturi():獲取發(fā)出請(qǐng)求字符串的客戶(hù)端地址 getremoteaddr():獲取客戶(hù)端的ip地址 getremotehost():獲取客戶(hù)端的名字
getsession([boolean create]):返回和請(qǐng)求相關(guān)session getservername():獲取服務(wù)器的名字
getservletpath():獲取客戶(hù)端所請(qǐng)求的腳本文件的路徑 getserverport():獲取服務(wù)器的端口號(hào)
removeattribute(string name):刪除請(qǐng)求中的一個(gè)屬性
85、我們?cè)趙eb應(yīng)用開(kāi)發(fā)過(guò)程中經(jīng)常遇到輸出某種編碼的字符,如iso8859-1等,如何輸出一個(gè)某種編碼的字符串? 答:
public string translate(string str){ string tempstr = “";try { tempstr = new string(es(”iso-8859-1“), ”gbk");tempstr = ();} catch(exception e){ n(sage());} return tempstr;} 86、servlet執(zhí)行時(shí)一般實(shí)現(xiàn)哪幾個(gè)方法? 答:
public void init(servletconfig config)public servletconfig getservletconfig()public string getservletinfo()public void service(servletrequest request,servletresponse response)public void destroy()
jdbc、jdo方面88、jdo是什么?
87、e的作用?為什么要用?
答:調(diào)用該訪問(wèn)返回一個(gè)以字符串指定類(lèi)名的類(lèi)的對(duì)象。答:jdo是java對(duì)象持久化的新的規(guī)范,為java data object的簡(jiǎn)稱(chēng),也是一個(gè)用于存取某種數(shù)據(jù)倉(cāng)庫(kù)中的對(duì)象的標(biāo)準(zhǔn)化api。jdo提供了透明的對(duì)象存儲(chǔ),因此對(duì)開(kāi)發(fā)人員來(lái)說(shuō),存儲(chǔ)數(shù)據(jù)對(duì)象完全不需要額外的代碼(如jdbc api的使用)。這些繁瑣的例行工作已經(jīng)轉(zhuǎn)移到j(luò)do產(chǎn)品提供商身上,使開(kāi)發(fā)人員解脫出來(lái),從而集中時(shí)間和精力在業(yè)務(wù)邏輯上。另外,jdo很靈活,因?yàn)樗梢栽谌魏螖?shù)據(jù)底層上運(yùn)行。jdbc只是面向關(guān)系數(shù)據(jù)庫(kù)(rdbms)jdo更通用,提供到任何數(shù)據(jù)底層的存儲(chǔ)功能,比如關(guān)系數(shù)據(jù)庫(kù)、文件、xml以及對(duì)象數(shù)據(jù)庫(kù)(odbms)等等,使得應(yīng)用可移植性更強(qiáng)。89、說(shuō)出數(shù)據(jù)連接池的工作機(jī)制是什么? 答:j2ee服務(wù)器啟動(dòng)時(shí)會(huì)建立一定數(shù)量的池連接,并一直維持不少于此數(shù)目的池連接??蛻?hù)端程序需要連接時(shí),池驅(qū)動(dòng)程序會(huì)返回一個(gè)未使用的池連接并將其表記為忙。如果當(dāng)前沒(méi)有空閑連接,池驅(qū)動(dòng)程序就新建一定數(shù)量的連接,新建連接的數(shù)量有配置參數(shù)決定。當(dāng)使用的池連接調(diào)用完成后,池驅(qū)動(dòng)程序?qū)⒋诉B接表記為空閑,其他調(diào)用就可以使用這個(gè)連接。90、jdo是什么? 答:jdo是java對(duì)象持久化的新的規(guī)范,為java data object的簡(jiǎn)稱(chēng),也是一個(gè)用于存取某種數(shù)據(jù)倉(cāng)庫(kù)中的對(duì)象的標(biāo)準(zhǔn)化api。jdo提供了透明的對(duì)象存儲(chǔ),因此對(duì)開(kāi)發(fā)人員來(lái)說(shuō),存儲(chǔ)數(shù)據(jù)對(duì)象完全不需要額外的代碼(如jdbc api的使用)。這些繁瑣的例行工作已經(jīng)轉(zhuǎn)移到j(luò)do產(chǎn)品提供商身上,使開(kāi)發(fā)人員解脫出來(lái),從而集中時(shí)間和精力在業(yè)務(wù)邏輯上。另外,jdo很靈活,因?yàn)樗梢栽谌魏螖?shù)據(jù)底層上運(yùn)行。jdbc只是面向關(guān)系數(shù)據(jù)庫(kù)(rdbms)jdo更通用,提供到任何數(shù)據(jù)底層的存儲(chǔ)功能,比如關(guān)系數(shù)據(jù)庫(kù)、文件、xml以及對(duì)象數(shù)據(jù)庫(kù)(odbms)等等,使得應(yīng)用可移植性更強(qiáng)。
xml方面
91、xml有哪些解析技術(shù)?區(qū)別是什么? 答:有dom,sax,stax等
dom:處理大型文件時(shí)其性能下降的非常厲害。這個(gè)問(wèn)題是由dom的樹(shù)結(jié)構(gòu)所造成的,這種結(jié)構(gòu)占用的內(nèi)存較多,而且dom必須在解析文件之前把整個(gè)文檔裝入內(nèi)存,適合對(duì)xml的隨機(jī)訪問(wèn)。
sax:不現(xiàn)于dom,sax是事件驅(qū)動(dòng)型的xml解析方式。它順序讀取xml文件,不需要一次全部裝載整個(gè)文件。當(dāng)遇到像文件開(kāi)頭,文檔結(jié)束,或者標(biāo)簽開(kāi)頭與標(biāo)簽結(jié)束時(shí),它會(huì)觸發(fā)一個(gè)事件,用戶(hù)通過(guò)在其回調(diào)事件中寫(xiě)入處理代碼來(lái)處理xml文件,適合對(duì)xml的順序訪問(wèn) stax:streaming api for xml(stax)92、你在項(xiàng)目中用到了xml技術(shù)的哪些方面?如何實(shí)現(xiàn)的?
答:用到了數(shù)據(jù)存貯,信息配置兩方面。在做數(shù)據(jù)交換平臺(tái)時(shí),將不能數(shù)據(jù)源的數(shù)據(jù)組裝成xml文件,然后將xml文件壓縮打包加密后通過(guò)網(wǎng)絡(luò)傳送給接收者,接收解密與解壓縮后再同xml文件中還原相關(guān)信息進(jìn)行處理。在做軟件配置時(shí),利用xml可以很方便的進(jìn)行,軟件的各種配置參數(shù)都存貯在xml文件中。
93、xml文檔定義有幾種形式?它們之間有何本質(zhì)區(qū)別?解析xml文檔有哪幾種方式? 答:a: 兩種形式 dtd schema,b: 本質(zhì)區(qū)別:schema本身是xml的,可以被xml解析器解析(這也是從dtd上發(fā)展schema的根本目的),c:有dom,sax,stax等
dom:處理大型文件時(shí)其性能下降的非常厲害。這個(gè)問(wèn)題是由dom的樹(shù)結(jié)構(gòu)所造成的,這種結(jié)構(gòu)占用的內(nèi)存較多,而且dom必須在解析文件之前把整個(gè)文檔裝入內(nèi)存,適合對(duì)xml的隨機(jī)訪問(wèn)
sax:不現(xiàn)于dom,sax是事件驅(qū)動(dòng)型的xml解析方式。它順序讀取xml文件,不需要一次全部裝載整個(gè)文件。當(dāng)遇到像文件開(kāi)頭,文檔結(jié)束,或者標(biāo)簽開(kāi)頭與標(biāo)簽結(jié)束時(shí),它會(huì)觸發(fā)一個(gè)事件,用戶(hù)通過(guò)在其回調(diào)事件中寫(xiě)入處理代碼來(lái)處理xml文件,適合對(duì)xml的順序訪問(wèn) stax:streaming api for xml(stax)
java線程知識(shí)點(diǎn)總結(jié) java線程寫(xiě)法篇三
java線程總結(jié)
首先要理解線程首先需要了解一些基本的東西,我們現(xiàn)在所使用的大多數(shù)操作系統(tǒng)都屬于多任務(wù),分時(shí)操作系統(tǒng)。正是由于這種操作系統(tǒng)的出現(xiàn)才有了多線程這個(gè)概念。我們使用的windows,linux就屬于此列。什么是分時(shí)操作系統(tǒng)呢,通俗一點(diǎn)與就是可以同一時(shí)間執(zhí)行多個(gè)程序的操作系統(tǒng),在自己的電腦上面,你是不是一邊聽(tīng)歌,一邊聊天還一邊看網(wǎng)頁(yè)呢?但實(shí)際上,并不上cpu在同時(shí)執(zhí)行這些程序,cpu只是將時(shí)間切割為時(shí)間片,然后將時(shí)間片分配給這些程序,獲得時(shí)間片的程序開(kāi)始執(zhí)行,不等執(zhí)行完畢,下個(gè)程序又獲得時(shí)間片開(kāi)始執(zhí)行,這樣多個(gè)程序輪流執(zhí)行一段時(shí)間,由于現(xiàn)在cpu的高速計(jì)算能力,給人的感覺(jué)就像是多個(gè)程序在同時(shí)執(zhí)行一樣。
一般可以在同一時(shí)間內(nèi)執(zhí)行多個(gè)程序的操作系統(tǒng)都有進(jìn)程的概念.一個(gè)進(jìn)程就是一個(gè)執(zhí)行中的程序,而每一個(gè)進(jìn)程都有自己獨(dú)立的一塊內(nèi)存空間,一組系統(tǒng)資源.在進(jìn)程概念中,每一個(gè)進(jìn)程的內(nèi)部數(shù)據(jù)和狀態(tài)都是完全獨(dú)立的.因此可以想像創(chuàng)建并執(zhí)行一個(gè)進(jìn)程的系統(tǒng)開(kāi)像是比較大的,所以線程出現(xiàn)了。在java中,程序通過(guò)流控制來(lái)執(zhí)行程序流,程序中單個(gè)順序的流控制稱(chēng)為線程,多線程則指的是在單個(gè)程序中可以同時(shí)運(yùn)行多個(gè)不同的線程,執(zhí)行不同的任務(wù).多線程意味著一個(gè)程序的多行語(yǔ)句可以看上去幾乎在同一時(shí)間內(nèi)同時(shí)運(yùn)行.(你可以將前面一句話的程序換成進(jìn)程,進(jìn)程是程序的一次執(zhí)行過(guò)程,是系統(tǒng)運(yùn)行程序的基本單位)
線程與進(jìn)程相似,是一段完成某個(gè)特定功能的代碼,是程序中單個(gè)順序的流控制;但與進(jìn)程不同的是,同類(lèi)的多個(gè)線程是共享一塊內(nèi)存空間和一組系統(tǒng)資源,而線程本身的數(shù)據(jù)通常只有微處理器的寄存器數(shù)據(jù),以及一個(gè)供程序執(zhí)行時(shí)使用的堆棧.所以系統(tǒng)在產(chǎn)生一個(gè)線程,或者在各個(gè)線程之間切換時(shí),負(fù)擔(dān)要比進(jìn)程小的多,正因如此,線程也被稱(chēng)為輕負(fù)荷進(jìn)程(light-weight process).一個(gè)進(jìn)程中可以包含多個(gè)線程.多任務(wù)是指在一個(gè)系統(tǒng)中可以同時(shí)運(yùn)行多個(gè)程序,即有多個(gè)獨(dú)立運(yùn)行的任務(wù),每個(gè)任務(wù)對(duì)應(yīng)一個(gè)進(jìn)程,同進(jìn)程一樣,一個(gè)線程也有從創(chuàng)建,運(yùn)行到消亡的過(guò)程,稱(chēng)為線程的生命周期.用線程的狀態(tài)(state)表明線程處在生命周期的哪個(gè)階段.線程有創(chuàng)建,可運(yùn)行,運(yùn)行中,阻塞,死亡五中狀態(tài).通過(guò)線程的控制與調(diào)度可使線程在這幾種狀態(tài)間轉(zhuǎn)化每個(gè)程序至少自動(dòng)擁有一個(gè)線程,稱(chēng)為主線程.當(dāng)程序加載到內(nèi)存時(shí),啟動(dòng)主線程.[線程的運(yùn)行機(jī)制以及調(diào)度模型]
java中多線程就是一個(gè)類(lèi)或一個(gè)程序執(zhí)行或管理多個(gè)線程執(zhí)行任務(wù)的能力,每個(gè)線程可以獨(dú)立于其他線程而獨(dú)立運(yùn)行,當(dāng)然也可以和其他線程協(xié)同運(yùn)行,一個(gè)類(lèi)控制著它的所有線程,可以決定哪個(gè)線程得到優(yōu)先級(jí),哪個(gè)線程可以訪問(wèn)其他類(lèi)的資源,哪個(gè)線程開(kāi)始執(zhí)行,哪個(gè)保持休眠狀態(tài)。下面是線程的機(jī)制圖:
page 1 of 16
線程的狀態(tài)表示線程正在進(jìn)行的活動(dòng)以及在此時(shí)間段內(nèi)所能完成的任務(wù).線程有創(chuàng)建,可運(yùn)行,運(yùn)行中,阻塞,死亡五中狀態(tài).一個(gè)具有生命的線程,總是處于這五種狀態(tài)之一: 1.創(chuàng)建狀態(tài)
使用new運(yùn)算符創(chuàng)建一個(gè)線程后,該線程僅僅是一個(gè)空對(duì)象,系統(tǒng)沒(méi)有分配資源,稱(chēng)該線程處于創(chuàng)建狀態(tài)(new thread)2.可運(yùn)行狀態(tài)
使用start()方法啟動(dòng)一個(gè)線程后,系統(tǒng)為該線程分配了除cpu外的所需資源,使該線程處于可運(yùn)行狀態(tài)(runnable)3.運(yùn)行中狀態(tài)
java運(yùn)行系統(tǒng)通過(guò)調(diào)度選中一個(gè)runnable的線程,使其占有cpu并轉(zhuǎn)為運(yùn)行中狀態(tài)(running).此時(shí),系統(tǒng)真正執(zhí)行線程的run()方法.4.阻塞狀態(tài)
一個(gè)正在運(yùn)行的線程因某種原因不能繼續(xù)運(yùn)行時(shí),進(jìn)入阻塞狀態(tài)(blocked)5.死亡狀態(tài)
線程結(jié)束后是死亡狀態(tài)(dead)
同一時(shí)刻如果有多個(gè)線程處于可運(yùn)行狀態(tài),則他們需要排隊(duì)等待cpu資源.此時(shí)每個(gè)線程自動(dòng)獲得一個(gè)線程的優(yōu)先級(jí)(priority),優(yōu)先級(jí)的高低反映線程的重要或緊急程度.可運(yùn)行狀態(tài)的線程按優(yōu)先級(jí)排隊(duì),線程調(diào)度依據(jù)優(yōu)先級(jí)基礎(chǔ)上的“先到先服務(wù)”原則.線程調(diào)度管理器負(fù)責(zé)線程排隊(duì)和cpu在線程間的分配,并由線程調(diào)度算法進(jìn)行調(diào)度.當(dāng)線程調(diào)度管理器選種某個(gè)線程時(shí),該線程獲得cpu資源而進(jìn)入運(yùn)行狀態(tài).線程調(diào)度是先占式調(diào)度,即如果在當(dāng)前線程執(zhí)行過(guò)程中一個(gè)更高優(yōu)先級(jí)的線程進(jìn)入可運(yùn)行狀態(tài),則這個(gè)線程立即被調(diào)度執(zhí)行.先占式調(diào)度分為:獨(dú)占式和分時(shí)方式.獨(dú)占方式下,當(dāng)前執(zhí)行線程將一直執(zhí)行下去,直 到執(zhí)行完畢或由于某種原因主動(dòng)放棄cpu,或cpu被一個(gè)更高優(yōu)先級(jí)的線程搶占
分時(shí)方式下,當(dāng)前運(yùn)行線程獲得一個(gè)時(shí)間片,時(shí)間到時(shí),即使沒(méi)有執(zhí)行完也要讓出
page 2 of 16
cpu,進(jìn)入可運(yùn)行狀態(tài),等待下一個(gè)時(shí)間片的調(diào)度.系統(tǒng)選中其他可運(yùn)行狀態(tài)的線程執(zhí)行
分時(shí)方式的系統(tǒng)使每個(gè)線程工作若干步,實(shí)現(xiàn)多線程同時(shí)運(yùn)行
另外請(qǐng)注意下面的線程調(diào)度規(guī)則(如果有不理解,不急,往下看): ①如果兩個(gè)或是兩個(gè)以上的線程都修改一個(gè)對(duì)象,那么把執(zhí)行修改的方法定義為被同步的(synchronized),如果對(duì)象更新影響到只讀方法,那么只度方法也應(yīng)該定義為同步的
②如果一個(gè)線程必須等待一個(gè)對(duì)象狀態(tài)發(fā)生變化,那么它應(yīng)該在對(duì)象內(nèi)部等待,而不是在外部等待,它可以調(diào)用一個(gè)被同步的方法,并讓這個(gè)方法調(diào)用wait()③每當(dāng)一個(gè)方法改變某個(gè)對(duì)象的狀態(tài)的時(shí)候,它應(yīng)該調(diào)用notifyall()方法,這給等待隊(duì)列的線程提供機(jī)會(huì)來(lái)看一看執(zhí)行環(huán)境是否已發(fā)生改變
④記住wait(),notify(),notifyall()方法屬于object類(lèi),而不是thread類(lèi),仔細(xì)檢查看是否每次執(zhí)行wait()方法都有相應(yīng)的notify()或notifyall()方法,且它們作用與相同的對(duì)象 在java中每個(gè)類(lèi)都有一個(gè)主線程,要執(zhí)行一個(gè)程序,那么這個(gè)類(lèi)當(dāng)中一定要有main方法,這個(gè)man方法也就是java class中的主線程。你可以自己創(chuàng)建線程,有兩種方法,一是繼承thread類(lèi),或是實(shí)現(xiàn)runnable接口。一般情況下,最好避免繼承,因?yàn)閖ava中是單根繼承,如果你選用繼承,那么你的類(lèi)就失去了彈性,當(dāng)然也不能全然否定繼承thread,該方法編寫(xiě)簡(jiǎn)單,可以直接操作線程,適用于單重繼承情況。至于選用那一種,具體情況具體分析。
eg.繼承thread
public class mythread_1 extends thread{ public void run(){ //some code } }
eg.實(shí)現(xiàn)runnable接口
public class mythread_2 implements runnable { public void run(){ //some code } }
page 3 of 16
當(dāng)使用繼承創(chuàng)建線程,這樣啟動(dòng)線程:
new mythread_1().start()
當(dāng)使用實(shí)現(xiàn)接口創(chuàng)建線程,這樣啟動(dòng)線程:
new thread(new mythread_2()).start()
注意,其實(shí)是創(chuàng)建一個(gè)線程實(shí)例,并以實(shí)現(xiàn)了runnable接口的類(lèi)為參數(shù)傳入這個(gè)實(shí)例,當(dāng)執(zhí)行這個(gè)線程的時(shí)候,mythread_2中run里面的代碼將被執(zhí)行。下面是完成的例子:
public class mythread implements runnable { public void run(){ n(“my name is ”+tthread().getname());} public static void main(string[] args){ new thread(new mythread()).start();} }
執(zhí)行后將打印出: my name is thread-0
你也可以創(chuàng)建多個(gè)線程,像下面這樣
new thread(new mythread()).start();new thread(new mythread()).start();new thread(new mythread()).start();
那么會(huì)打印出:
my name is thread-0 my name is thread-1
page 4 of 16
my name is thread-2
看了上面的結(jié)果,你可能會(huì)認(rèn)為線程的執(zhí)行順序是依次執(zhí)行的,但是那只是一般情況,千萬(wàn)不要用以為是線程的執(zhí)行機(jī)制;影響線程執(zhí)行順序的因素有幾點(diǎn):首先看看前面提到的優(yōu)先級(jí)別
public class mythread implements runnable { public void run(){ n(“my name is ”+tthread().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());
ority(_priority);//賦予最高優(yōu)先級(jí)
();();();} }
再看看結(jié)果:
my name is thread-1 my name is thread-0 my name is thread-2
page 5 of 16
線程的優(yōu)先級(jí)分為10級(jí),分別用1到10的整數(shù)代表,默認(rèn)情況是5。上面的ority(_priority)ority(10)
然后是線程程序本身的設(shè)計(jì),比如使用sleep,yield,join,wait等方法(詳情請(qǐng)看jdkdocument)
public class mythread implements runnable { public void run(){
try {
int sleeptime =(int)(()* 100);// 產(chǎn)生隨機(jī)數(shù)字,tthread().sleep(sleeptime);// 讓其休眠一定時(shí)間,時(shí)間又上面sleeptime決定
// public static void sleep(long millis)throw interruptedexception
//(api)
n(tthread().getname()+ “ 睡了 ”
+ sleeptime);
} catch(interruptedexception ie)
// 由于線程在休眠可能被中斷,所以調(diào)用sleep方法的時(shí)候需要捕捉異常
page 6 of 16
{
tacktrace();
} }
public static void main(string[] args){
thread t1 = new thread(new mythread());
thread t2 = new thread(new mythread());
thread t3 = new thread(new mythread());
();
();
();} }
執(zhí)行后觀察其輸出: thread-0 睡了 11 thread-2 睡了 48 thread-1 睡了 69
上面的執(zhí)行結(jié)果是隨機(jī)的,再執(zhí)行很可能出現(xiàn)不同的結(jié)果。由于上面我在run中添加了休眠語(yǔ)句,當(dāng)線程休眠的時(shí)候就會(huì)讓出cpu,cpu將會(huì)選擇執(zhí)行處于runnable狀態(tài)中的其他線程,當(dāng)然也可能出現(xiàn)這種情況,休眠的thread立即進(jìn)入了runnable狀態(tài),cpu再次執(zhí)行它。[線程組概念] 線程是可以被組織的,java中存在線程組的概念,每個(gè)線程都是一個(gè)線程組的成員,線程組把多個(gè)線程集成為一個(gè)對(duì)象,通過(guò)線程組可以同時(shí)對(duì)其中的多個(gè)線程進(jìn)行操作,包中的thread——group類(lèi)用來(lái)管理一組線程,包括:線程的數(shù)目,線程間的關(guān)系,線程正在執(zhí)行的操作,以及線程將要啟動(dòng)或終止時(shí)間等.線程組還可以包含線程組.在java的應(yīng)用程序中,最高層的線程組是名位main的線程組,在main中還可以加入線程或
page 7 of 16
線程組,在mian的子線程組中也可以加入線程和線程組,形成線程組和線程之間的樹(shù)狀繼承關(guān)系。像上面創(chuàng)建的線程都是屬于main這個(gè)線程組的。借用上面的例子,main里面可以這樣寫(xiě):
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,t2,t3被加入group2,group2加入group1。
page 8 of 16
另外一個(gè)比較多就是關(guān)于線程同步方面的,試想這樣一種情況,你有一筆存款在銀行,你在一家銀行為你的賬戶(hù)存款,而你的妻子在另一家銀行從這個(gè)賬戶(hù)提款,現(xiàn)在你有1000塊在你的賬戶(hù)里面。你存入了1000,但是由于另一方也在對(duì)這筆存款進(jìn)行操作,人家開(kāi)始執(zhí)行的時(shí)候只看到賬戶(hù)里面原來(lái)的1000元,當(dāng)你的妻子提款1000元后,你妻子所在的銀行就認(rèn)為你的賬戶(hù)里面沒(méi)有錢(qián)了,而你所在的銀行卻認(rèn)為你還有2000元??纯聪旅娴睦樱?/p>
class blanksaving // 儲(chǔ)蓄賬戶(hù) { private static int money = 10000;
public void add(int i){
money = money + i;
n(“husband 向銀行存入了 [¥” + i + “]”);}
public void get(int i){
money = money-i;
n(“wife 向銀行取走了 [¥” + i + “]”);
if(money < 0)
n(“余額不足!”);}
page 9 of 16
public int showmoney(){
return money;} }
class operater implements runnable { string name;blanksaving bs;
public operater(blanksaving b, string s){
name = s;
bs = b;
}
public static void oper(string name, blanksaving bs){
if((“husband”)){
try {
for(int i = 0;i < 10;i++){
page 10 of 16
tthread().sleep((int)(()* 300));
(1000);
}
} catch(interruptedexception e){
}
} else {
try {
for(int i = 0;i < 10;i++){
tthread().sleep((int)(()* 300));
(1000);
}
} catch(interruptedexception e){
}
} }
public void run(){
oper(name, bs);}
page 11 of 16
}
public class banktest { public static void main(string[] args)throws interruptedexception {
blanksaving bs = new blanksaving();
operater o1 = new operater(bs, “husband”);
operater o2 = new operater(bs, “wife”);
thread t1 = new thread(o1);
thread t2 = new thread(o2);
();
();
tthread().sleep(500);} }
下面是其中一次的執(zhí)行結(jié)果:
---------first--------------husband 向銀行存入了 [¥1000] wife 向銀行取走了 [¥1000] wife 向銀行取走了 [¥1000] husband 向銀行存入了 [¥1000] wife 向銀行取走了 [¥1000] husband 向銀行存入了 [¥1000] wife 向銀行取走了 [¥1000] husband 向銀行存入了 [¥1000] wife 向銀行取走了 [¥1000] husband 向銀行存入了 [¥1000] husband 向銀行存入了 [¥1000]
page 12 of 16
wife 向銀行取走了 [¥1000] husband 向銀行存入了 [¥1000] husband 向銀行存入了 [¥1000] wife 向銀行取走了 [¥1000] wife 向銀行取走了 [¥1000] husband 向銀行存入了 [¥1000] wife 向銀行取走了 [¥1000] wife 向銀行取走了 [¥1000] husband 向銀行存入了 [¥1000]
看到了嗎,這可不是正確的需求,在husband還沒(méi)有結(jié)束操作的時(shí)候,wife就插了進(jìn)來(lái),這樣很可能導(dǎo)致意外的結(jié)果。解決辦法很簡(jiǎn)單,就是將對(duì)數(shù)據(jù)進(jìn)行操作方法聲明為synchronized,當(dāng)方法被該關(guān)鍵字聲明后,也就意味著,如果這個(gè)數(shù)據(jù)被加鎖,只有一個(gè)對(duì)象得到這個(gè)數(shù)據(jù)的鎖的時(shí)候該對(duì)象才能對(duì)這個(gè)數(shù)據(jù)進(jìn)行操作。也就是當(dāng)你存款的時(shí)候,這筆賬戶(hù)在其他地方是不能進(jìn)行操作的,只有你存款完畢,銀行管理人員將賬戶(hù)解鎖,其他人才能對(duì)這個(gè)賬戶(hù)進(jìn)行操作。
修改public static void oper(string name,blanksaving bs)為public static void oper(string name,blanksaving bs),再看看結(jié)果:
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]
當(dāng)丈夫完成操作后,妻子才開(kāi)始執(zhí)行操作,這樣的話,對(duì)共享對(duì)象的操作就不會(huì)有問(wèn)題了。
[wait and notify] 你可以利用這兩個(gè)方法很好的控制線程的執(zhí)行流程,當(dāng)線程調(diào)用wait方法后,線
page 13 of 16
程將被掛起,直到被另一線程喚醒(notify)或則是如果wait方法指定有時(shí)間得話,在沒(méi)有被喚醒的情況下,指定時(shí)間時(shí)間過(guò)后也將自動(dòng)被喚醒。但是要注意一定,被喚醒并不是指馬上執(zhí)行,而是從組塞狀態(tài)變?yōu)榭蛇\(yùn)行狀態(tài),其是否運(yùn)行還要看cpu的調(diào)度。事例代碼:
class mythread_1 extends thread {
object lock;
public mythread_1(object o){
lock = o;}
public void run(){
try {
synchronized(lock){
n(“enter thread_1 and wait”);
();
n(“be notified”);
}
} catch(interruptedexception e){
} }
page 14 of 16
}
class mythread_2 extends thread { object lock;
public mythread_2(object o){
lock = o;}
public void run(){
synchronized(lock){
n(“enter thread_2 and notify”);
();
} } }
public class mythread { public static void main(string[] args){
int[] in = new int[0];// notice
mythread_1 t1 = new mythread_1(in);
page 15 of 16
mythread_2 t2 = new mythread_2(in);
();
();} }
執(zhí)行結(jié)果如下:
enter thread_1 and wait enter thread_2 and notify thread_1 be notified
可能你注意到了在使用wait and notify方法得時(shí)候我使用了synchronized塊來(lái)包裝這兩個(gè)方法,這是由于調(diào)用這兩個(gè)方法的時(shí)候線程必須獲得鎖,也就是上面代碼中的lock[],如果你不用synchronized包裝這兩個(gè)方法的得話,又或則鎖不一是同一把,比如在mythread_2中synchronized(lock)改為synchronized(this),lmonitorstateexception執(zhí)行期異常。另外wait and notify方法是object中的,并不在thread這個(gè)類(lèi)中。最后你可能注意到了這點(diǎn):int[] in=new int[0];為什么不是創(chuàng)建new object而是一個(gè)0長(zhǎng)度的數(shù)組,那是因?yàn)樵趈ava中創(chuàng)建一個(gè)0長(zhǎng)度的數(shù)組來(lái)充當(dāng)鎖更加高效。
page 16 of 16
java線程知識(shí)點(diǎn)總結(jié) java線程寫(xiě)法篇四
1.什么是gui?
a)gui是graphics user interface的全稱(chēng),意思是圖形用戶(hù)界面.2.為什么需要gui?
a)圖形用戶(hù)界面能夠讓最終用戶(hù)通過(guò)鼠標(biāo)拖動(dòng)、單擊等動(dòng)作就可以操作整個(gè)應(yīng)用,從而提高應(yīng)用的用戶(hù)體驗(yàn)效果,
a)awt是sun公司提供的一個(gè)基本的gui類(lèi)庫(kù),被稱(chēng)為抽象工具集(abstract
window-toolkit),它為java應(yīng)用程序提供了基本的組件.b)awt組件需要調(diào)用運(yùn)行平臺(tái)的圖形界面來(lái)創(chuàng)建和平臺(tái)一致的對(duì)等體,所以awt只
能使用所有平臺(tái)都支持的公共組件,因此awt只能夠提供一些 的主要組成部分
a)component,代表一個(gè)具體圖形表示能力的對(duì)象,可以在屏幕上顯示,并與用戶(hù)交互.通常我們把它稱(chēng)為”組件”.b)menucomponent,r,,em,代表一個(gè)菜單項(xiàng).c)container,代表一個(gè)awt組件容器,可以盛裝其他commponent組件,它繼承自
component抽象類(lèi),,,,代表一個(gè)對(duì)話框
a)filedialog代表一個(gè)文件對(duì)話框,,可容納其他組件,但不能獨(dú)立存在,必須被添加到其他容器中.ii.scrollpane,帶滾動(dòng)條的容器.d)layoutmanager,布局管理器,yout,流式布局,layout,邊框布局,只能盛裝5個(gè)組件,yout,網(wǎng)格布局,glayout,網(wǎng)格包布局,一種較為復(fù)雜的布局管理器,yout,卡片布局,以時(shí)間來(lái)管理容器內(nèi)的組件,將組件看作是一張張卡片,每次顯示最外面一張卡片(組件).boxlayou,箱式布局, 的事件
a)應(yīng)用程序響應(yīng)用戶(hù)的某個(gè)動(dòng)作或請(qǐng)求,如用戶(hù)單擊了一下鼠標(biāo),用戶(hù)請(qǐng)求關(guān)閉應(yīng)用
程序窗口等.b)awt編程中,所有事件的處理都必須交給特定的對(duì)象來(lái)完成,我們將這個(gè)特定的對(duì)
象稱(chēng)為事件監(jiān)聽(tīng)器.c)awt的事件處理機(jī)制是一種委派式的事件處理方式,通過(guò)將某個(gè)事件監(jiān)聽(tīng)器注冊(cè)
到用戶(hù)指定的組件,當(dāng)用戶(hù)進(jìn)行某個(gè)操作并觸發(fā)指定事件時(shí),應(yīng)用程序會(huì)自動(dòng)產(chǎn)生一個(gè)事件(event)對(duì)象并作為參數(shù)傳給事件監(jiān)聽(tīng)器中的事件處理器,然后由事件監(jiān)
聽(tīng)器通知事件處理器來(lái)響應(yīng)用戶(hù),完成用戶(hù)的請(qǐng)求.d)不同的事件需要不同的事件監(jiān)聽(tīng)器,不同的監(jiān)聽(tīng)器需要實(shí)現(xiàn)不同的監(jiān)聽(tīng)器接口.e)事件監(jiān)聽(tīng)器接口:為某個(gè)特定事件定義了響應(yīng)用戶(hù)請(qǐng)求的方法,當(dāng)用戶(hù)將某個(gè)事件
監(jiān)聽(tīng)器注冊(cè)到指定組件上以響應(yīng)特定的事件時(shí),則該事件監(jiān)聽(tīng)器必須實(shí)現(xiàn)對(duì)應(yīng)的事件監(jiān)聽(tīng)器接口才能對(duì)用戶(hù)的請(qǐng)求進(jìn)行有效處理.例如,用戶(hù)點(diǎn)擊了鼠標(biāo)右鍵,希望打開(kāi)某個(gè)應(yīng)用程序的右鍵菜單,則注冊(cè)到該應(yīng)用程序上的事件監(jiān)聽(tīng)器必須實(shí)現(xiàn)鼠標(biāo)事件監(jiān)聽(tīng)器接口,并實(shí)現(xiàn)該接口內(nèi)部某些方法來(lái)完成用戶(hù)的請(qǐng)求.f)事件適配器,很多時(shí)候,我們只需要實(shí)現(xiàn)某個(gè)事件監(jiān)聽(tīng)器接口中個(gè)別方法就能完成應(yīng)用程序的實(shí)際需求,但實(shí)現(xiàn)該事件監(jiān)聽(tīng)器接口的類(lèi)必須實(shí)現(xiàn)該接口中所有的抽象方法,這會(huì)造成代碼的冗余.而事件適配器可以幫我們解決這個(gè)問(wèn)題,事件適配器實(shí)現(xiàn)了所有的擁有多個(gè)抽象方法的事件監(jiān)聽(tīng)器接口,并空實(shí)現(xiàn)了這些接口中所有的抽象方法,所謂空實(shí)現(xiàn),就是方法中沒(méi)有任何實(shí)現(xiàn)代碼,因此,我們可以通過(guò)繼承對(duì)應(yīng)事件監(jiān)聽(tīng)器接口的事件適配器抽象類(lèi),并實(shí)現(xiàn)我們感興趣的方法來(lái)完成應(yīng)用需求即可.g)java事件處理過(guò)程中主要涉及的三類(lèi)對(duì)象
i.事件源,.事件,通常指用戶(hù)的某個(gè)操作,如單擊了一下鼠標(biāo),.事件監(jiān)聽(tīng)器,負(fù)責(zé)監(jiān)聽(tīng)事件源上所發(fā)生的事件,并作出響應(yīng).h)awt事件監(jiān)聽(tīng)器的實(shí)現(xiàn)形式
.內(nèi)部類(lèi)形式 頂級(jí)類(lèi)形式
iii.類(lèi)本身作為事件監(jiān)聽(tīng)器
iv.匿名內(nèi)部類(lèi)形式
v.注:繪圖
a)awt繪圖的實(shí)現(xiàn)過(guò)程.i.重寫(xiě)畫(huà)布類(lèi)的paint方法,.調(diào)用component類(lèi)的repaint方法繪制圖形.b)awt實(shí)現(xiàn)繪圖主要涉及的對(duì)象
.c)component類(lèi)的子類(lèi)canvas類(lèi),cs,代表一個(gè)畫(huà)筆,類(lèi)代表了位圖,它的一個(gè)主要的實(shí)現(xiàn)類(lèi)bufferedimage是可以訪問(wèn)圖形數(shù)據(jù)
緩沖區(qū),并可以返回一個(gè)graphics對(duì)象來(lái)繪制該buuferedimage.d)的優(yōu)缺點(diǎn)
a)awt在許多非桌面環(huán)境,如嵌入式設(shè)備中有著自己的優(yōu)勢(shì),它的主要優(yōu)點(diǎn)如下:.iv.更少的內(nèi)存:對(duì)運(yùn)行在有限環(huán)境中的gui程序的開(kāi)發(fā),是合適的。2.更少的啟動(dòng)事件:由于awt組件是本地由操作系統(tǒng)實(shí)現(xiàn)的。絕大多數(shù)的二進(jìn)制代碼已經(jīng)在如系統(tǒng)啟動(dòng)的時(shí)候被預(yù)裝載了,這降低了它的啟動(dòng)事件。3.更好的響應(yīng):由于本地組件由操作系統(tǒng)渲染。4.成熟穩(wěn)定的:能夠正常工作并很少使你的程序崩潰。
b)同樣它也有不少的缺點(diǎn)
.更少組件類(lèi)型:表和樹(shù)這些重要的組件缺失了。它們是桌面應(yīng)用程序中普遍使用的。2.缺乏豐富的組件特征:按鈕不支持圖片。3.無(wú)擴(kuò)展性:awt的組件是本地組件。jvm中的awt類(lèi)實(shí)例實(shí)際只是包含本地
組件的引用。唯一的擴(kuò)展點(diǎn)是awt的canvas組件,可以從零開(kāi)始創(chuàng)建自定義組
件。然而無(wú)法繼承和重用一個(gè)已有的awt組件
總結(jié):awt是sun不推薦使用的工具集,實(shí)際開(kāi)發(fā)中很少使用awt而是使用sun公司
和netscape公司共同開(kāi)發(fā)的一個(gè)新的用戶(hù)界面庫(kù)-swing來(lái)開(kāi)發(fā)gui應(yīng)用程序,awt是圖形用戶(hù)界面編程的基礎(chǔ),它的布局管理、事件機(jī)制、剪貼板操作等內(nèi)容仍然適用于swing gui編程.
java線程知識(shí)點(diǎn)總結(jié) java線程寫(xiě)法篇五
in the following code, which is the earliest statement, where the object originally held in e, may be garbage collected:
class test {
static void main(string args []){
ee e = new employee(“bob”, 48);
atepay();
n(etails());
6.e = null;
7.e = new employee(“denise”, 36);
atepay();
n(etails());
10.}
11.}
only one:
in the following code, which is the earliest statement, where the object originally held in e, may be garbage collected:
class test {
static void main(string args []){
ee e = new employee(“bob”, 48);
atepay();
n(etails());
6.e = null;
7.e = new employee(“denise”, 36);
atepay();
n(etails());
10.}
11.}
only one:
10
11
7
8
2:exhibit :
class test(e static int j = 0;
e static boolean methodb(int k)(5.j += k;
true;
6.)
static void methoda(int i){
n b:
10.b = i < 10 | methodb(4);
11.b = i < 10 || methodb(8);
12.)
static void main(string args[] }(a(0);
n(j);
17.)
18.)
what is the result?
program prints “0”
program prints “4”
program prints “8”
program prints “12”
3:what is written to the standard output given the following statement:n(4|7);
select the right answer:
a.4
b.5
c.6
d.7
4:
select valid identifier of java:
select valid identifier of java:
a.%passwd
b.3d_game
c.$charge
5:設(shè)有變量說(shuō)明語(yǔ)句int a=1,b=0;
則執(zhí)行以下程序段的輸出結(jié)果為()。
switch(a)
{
case 1:
switch(b)
{
case 0:printf(“**0**”);break;
case 1:printf(“**1**”);break;
}
case 2:printf(“**2**”);break;
}
printf(“ ”);
a.**0**
b.**0****2**
c.**0****1****2**
d.有語(yǔ)法錯(cuò)誤
6:in the following pieces of code, which one will compile without any error?
buffer sb1 = “abcd”;
n b = new boolean(“abcd”);
c.c: byte b = 255;
fl = 1.2;
7:
what is the result when you compile and run the following code?
public class throwsdemo
{
static void throwmethod()
{
n(“inside throwmethod.”);
throw new illegalaccessexception(“demo”);
}
public static void main(string args[])
{
try
{
throwmethod();
}
catch(illegalaccessexception e)
{
n(“caught ” + e);
}
}
}
choices:
what is the result when you compile and run the following code?
public class throwsdemo
{
static void throwmethod()
{
n(“inside throwmethod.”);
throw new illegalaccessexception(“demo”);
}
public static void main(string args[])
{
try
{
throwmethod();
}
catch(illegalaccessexception e)
{
n(“caught ” + e);
}
}
}
choices:
ation error
e error
e successfully, nothing is ed by caught:laccessexcption: demo
8:which of the following statements are not legal?
l = 4990;
i = 4l;
d = 34.4;
t = 0.9f.9:
give the following java class:
public class example{
public static void main(string args[]){
static int x[] = new int[15];
n(x[5]);
}
}
which statement is corrected?
give the following java class:
public class example{
public static void main(string args[]){
static int x[] = new int[15];
n(x[5]);
}
}
which statement is corrected?
compile, some error will run, some error will is is null.10:下面關(guān)于變量及其范圍的陳述哪些是錯(cuò)的。
a.實(shí)例變量是類(lèi)的成員變量。
b.實(shí)例變量用關(guān)鍵字static聲明。
c.在方法中定義的局部變量在該方法被執(zhí)行時(shí)創(chuàng)建
d.局部變量在使用前必須被初始化。
11:
public class x{
public object m(){
object o = new float(3.14f);//line 3
object [] oa = new object[1];//line 4
oa[0] = o;//line 5
o=null;//line 6
return oa[0];//line 7
}
}
when is the float object, created in line 3,eligible for garbage collection?
public class x{
public object m(){
object o = new float(3.14f);//line 3
object [] oa = new object[1];//line 4
oa[0] = o;//line 5
o=null;//line 6
return oa[0];//line 7
}
}
when is the float object, created in line 3,eligible for garbage collection?
after line after line 6
after line 7(that is,as the method returns)
in this method
12:
which is the most appropriate code snippet that can be inserted at line 18 in the following code?
(assume that the code is compiled and run with assertions enabled)
.*;
class asserttest
4.{
e hashmap cctld;
asserttest()
8.{
= new hashmap();
(“in”, “india”);
(“uk”, “united kingdom”);
(“au”, “australia”);
13.// more code...14.}
15.// other methods.... string getcountry(string countrycode)
17.{
18.// what should be inserted here?
country =(string)(countrycode);
country;
21.}
22.}
which is the most appropriate code snippet that can be inserted at line 18 in the following code?
(assume that the code is compiled and run with assertions enabled)
.*;
class asserttest
4.{
e hashmap cctld;
asserttest()
8.{
= new hashmap();
(“in”, “india”);
(“uk”, “united kingdom”);
(“au”, “australia”);
13.// more code...14.}
15.// other methods.... string getcountry(string countrycode)
17.{
18.// what should be inserted here?
country =(string)(countrycode);
country;
21.}
22.}
countrycode!= null;
countrycode!= null : “country code can not be null”;
cctld!= null : “no country code data is available”;
cctld : “no country code data is available”;
13:
give the following code:
public class example{
public static void main(string args[]){
int l=0;
do{
n(“doing it for l is:”+l);
}while(—l>0)
n(“finish”);
}
}
which well be output:
give the following code:
public class example{
public static void main(string args[]){
int l=0;
do{
n(“doing it for l is:”+l);
}while(—l>0)
n(“finish”);
}
}
which well be output:
it for l is 3
it for l is 1
it for l is 2
it for l is 0
14:which statements about java code security are not true?
bytecode verifier loads all classes needed for the execution of a ing code is performed by the runtime runtime the bytecodes are loaded, checked and run in an interpreter. class loader adds security by separating the namespaces for the classes of the local file system from those imported from network sources.15:a class design requires that a member variable should be accessible only by same package, which modifer word should be used?
ted
modifer
e
16:character流與byte流的區(qū)別是
a.每次讀入的字節(jié)數(shù)不同
b.前者帶有緩沖,后者沒(méi)有
c.前者是塊讀寫(xiě),后者是字節(jié)讀寫(xiě)
d.二者沒(méi)有區(qū)別,可以互換使用
簡(jiǎn)答題
17:找出兩個(gè)字符串中最大子字符串,如“abractyeyt”,“dgdsaeactyey”的最大子串為“actyet”
18:假設(shè)你有一個(gè)用1001個(gè)整數(shù)組成的數(shù)組,這些整數(shù)是任意排列的,但是你知道所有的整數(shù)都在1到1000(包括1000)之間。此外,除一個(gè)數(shù)字出現(xiàn)兩次外,其他所有數(shù)字只出現(xiàn)一次。假設(shè)你只能對(duì)這個(gè)數(shù)組做一次處理,用一種算法找出重復(fù)的那個(gè)數(shù)字。如果你在運(yùn)算中使用了輔助的存儲(chǔ)方式,那么你能找到不用這種方式的算法嗎?
19:到底在哪里使用cascade=“...”?
20:使用tomcat部署應(yīng)用程序 emoryerror 嗎?如何解決的。
21:請(qǐng)寫(xiě)一個(gè)java程序?qū)崿F(xiàn)數(shù)據(jù)庫(kù)緩沖池的功能?
22:有200個(gè)正整數(shù),且每個(gè)數(shù)均在1000至9999之間。請(qǐng)編制函數(shù),其函數(shù)的功能是:要求按每個(gè)數(shù)的后三位的大小進(jìn)行升序排列,然后取出滿(mǎn)足此條件的前10個(gè)數(shù)依次存入數(shù)組bb中,如果后三位的數(shù)值相等,則按原先的數(shù)值進(jìn)行降序排列。
23:anonymous inner class(匿名內(nèi)部類(lèi))是否可以extends(繼承)其它類(lèi),是否可以implements(實(shí)現(xiàn))interface(接口)?
24:找出字符串a(chǎn)中包含的字符可以進(jìn)行的所有不同組合。例如:abccd中,ab,ac,bc,cc,abd等都是可能的組合。
25:下面的代碼在絕大部分時(shí)間內(nèi)都運(yùn)行得很正常,請(qǐng)問(wèn)在什么情況下會(huì)出現(xiàn)問(wèn)題?問(wèn)題的根源在哪里?
import .linkedlist;
public class stack {
linkedlist list = new linkedlist();
public synchronized void push(object x){
synchronized(list){
t(x);
notify();
}
}
public synchronized object pop()
throws exception {
synchronized(list){
if(()<= 0){
wait();
}
return last();
}
}
}
【本文地址:http://www.aiweibaby.com/zuowen/1082486.html】