實驗十八 總複習java
實驗時間 2018-12-30程序員
1、實驗目的與要求編程
(1) 綜合掌握java基本程序結構;安全
(2) 綜合掌握java面向對象程序設計特色;多線程
(3) 綜合掌握java GUI 程序設計結構;app
(4) 綜合掌握java多線程編程模型;dom
(5) 綜合編程練習。分佈式
2、實驗內容和步驟ide
任務1:填寫課程課後調查問卷,網址:https://www.wjx.cn/jq/33108969.aspx。佈局
任務2:綜合編程練習
練習1:設計一個用戶信息採集程序,要求以下:
(1) 用戶信息輸入界面以下圖所示:
(1)用戶點擊提交按鈕時,用戶輸入信息顯示控制檯界面;
(2)用戶點擊重置按鈕後,清空用戶已輸入信息;
(3)點擊窗口關閉,程序退出。
package o; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridLayout; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; public class DemoJFrame extends JFrame { private JPanel jPanel1; private JPanel jPanel2; private JPanel jPanel3; private JPanel jPanel4; private JTextField fieldname; private JComboBox comboBox; private JTextField fieldadress; private ButtonGroup bg; private JRadioButton Male; private JRadioButton Female; private JCheckBox read; private JCheckBox sing; private JCheckBox dance; public DemoJFrame() { // 設置窗口大小 this.setSize(800, 400); // 設置可見性 this.setVisible(true); // 設置標題 this.setTitle("編程練習一"); // 設置關閉操做 this.setDefaultCloseOperation(EXIT_ON_CLOSE); // 設置窗口居中 WinCenter.center(this); // 建立四個面板對象 jPanel1 = new JPanel(); setJPanel1(jPanel1); jPanel2 = new JPanel(); setJPanel2(jPanel2); jPanel3 = new JPanel(); setJPanel3(jPanel3); jPanel4 = new JPanel(); setJPanel4(jPanel4); // 設置容器的爲流佈局 FlowLayout flowLayout = new FlowLayout(); this.setLayout(flowLayout); // 將四個面板添加到容器中 this.add(jPanel1); this.add(jPanel2); this.add(jPanel3); this.add(jPanel4); } /* * 設置面一 */ private void setJPanel1(JPanel jPanel) { // TODO 自動生成的方法存根 jPanel.setPreferredSize(new Dimension(700, 45)); // 給面板的佈局設置爲網格佈局 一行4列 jPanel.setLayout(new GridLayout(1, 4)); JLabel name = new JLabel("name:"); name.setSize(100, 50); fieldname = new JTextField(""); fieldname.setSize(80, 20); JLabel study = new JLabel("qualification:"); comboBox = new JComboBox(); comboBox.addItem("初中"); comboBox.addItem("高中"); comboBox.addItem("本科"); jPanel.add(name); jPanel.add(fieldname); jPanel.add(study); jPanel.add(comboBox); } /* * 設置面板二 */ private void setJPanel2(JPanel jPanel) { // TODO 自動生成的方法存根 jPanel.setPreferredSize(new Dimension(700, 50)); // 給面板的佈局設置爲網格佈局 一行4列 jPanel.setLayout(new GridLayout(1, 4)); JLabel name = new JLabel("address:"); fieldadress = new JTextField(); fieldadress.setPreferredSize(new Dimension(150, 50)); JLabel study = new JLabel("hobby:"); JPanel selectBox = new JPanel(); selectBox.setBorder(BorderFactory.createTitledBorder("")); selectBox.setLayout(new GridLayout(3, 1)); read = new JCheckBox("reading"); sing = new JCheckBox("singing"); dance = new JCheckBox("danceing"); selectBox.add(read); selectBox.add(sing); selectBox.add(dance); jPanel.add(name); jPanel.add(fieldadress); jPanel.add(study); jPanel.add(selectBox); } /* * 設置面板三 */ private void setJPanel3(JPanel jPanel) { // TODO 自動生成的方法存根 jPanel.setPreferredSize(new Dimension(700, 150)); FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT); jPanel.setLayout(flowLayout); JLabel sex = new JLabel("性別:"); JPanel selectBox = new JPanel(); selectBox.setBorder(BorderFactory.createTitledBorder("")); selectBox.setLayout(new GridLayout(2, 1)); bg = new ButtonGroup(); Male = new JRadioButton("male"); Female = new JRadioButton("female"); bg.add(Male ); bg.add(Female); selectBox.add(Male); selectBox.add(Female); jPanel.add(sex); jPanel.add(selectBox); } /* * 設置面板四 */ private void setJPanel4(JPanel jPanel) { // TODO 自動生成的方法存根 jPanel.setPreferredSize(new Dimension(700, 150)); FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER, 50, 10); jPanel.setLayout(flowLayout); jPanel.setLayout(flowLayout); JButton sublite = new JButton("提交"); JButton reset = new JButton("重置"); sublite.addActionListener((e) -> valiData()); reset.addActionListener((e) -> Reset()); jPanel.add(sublite); jPanel.add(reset); } /* * 提交數據 */ private void valiData() { // TODO 自動生成的方法存根 // 拿到數據 String name = fieldname.getText().toString().trim(); String xueli = comboBox.getSelectedItem().toString().trim(); String address = fieldadress.getText().toString().trim(); System.out.println(name); System.out.println(xueli); String hobbystring=""; if (read.isSelected()) { hobbystring+="reading "; } if (sing.isSelected()) { hobbystring+="singing "; } if (dance.isSelected()) { hobbystring+="dancing "; } System.out.println(address); if (Male.isSelected()) { System.out.println("male"); } if (Female.isSelected()) { System.out.println("female"); } System.out.println(hobbystring); } /* * 重置 */ private void Reset() { // TODO 自動生成的方法存根 fieldadress.setText(null); fieldname.setText(null); comboBox.setSelectedIndex(0); read.setSelected(false); sing.setSelected(false); dance.setSelected(false); bg.clearSelection(); } } DemoJFrame
package o; import java.awt.EventQueue; import javax.swing.JFrame; public class Main { public static void main(String[] args) { EventQueue.invokeLater(() -> { DemoJFrame page = new DemoJFrame(); }); } } Main
package o; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.Window; public class WinCenter { public static void center(Window win){ Toolkit tkit = Toolkit.getDefaultToolkit(); Dimension sSize = tkit.getScreenSize(); Dimension wSize = win.getSize(); if(wSize.height > sSize.height){ wSize.height = sSize.height; } if(wSize.width > sSize.width){ wSize.width = sSize.width; } win.setLocation((sSize.width - wSize.width)/ 2, (sSize.height - wSize.height)/ 2); } } WinCenter
練習2:採用GUI界面設計如下程序:
l 編制一個程序,將身份證號.txt 中的信息讀入到內存中;
l 按姓名字典序輸出人員信息;
l 查詢最大年齡的人員信息;
l 查詢最小年齡人員信息;
l 輸入你的年齡,查詢身份證號.txt中年齡與你最近人的姓名、身份證號、年齡、性別和出生地;
l 查詢人員中是否有你的同鄉。
l 輸入身份證信息,查詢所提供身份證號的人員信息,要求輸入一個身份證數字時,查詢界面就顯示知足查詢條件的查詢結果,且隨着輸入的數字的增多,查詢匹配的範圍逐漸縮小。
package xinxi; import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; import java.util.Timer; import javax.swing.*; public class Main extends JFrame { private static ArrayList<Person> Personlist; Scanner scanner = new Scanner(System.in); File file = new File("F:\\身份證號.txt"); private JPanel Panel; private JLabel JLabel; private JButton Button1,Button2,Button3; private JTextArea text,text1,text2,text3; boolean tru=true; public Main() { Panel = new JPanel(); Panel.setLayout(null); Button1 = new JButton("1:按姓名字典序輸出人員信息"); Button2 = new JButton("2:查詢最大年齡與最小年齡人員信息"); Button3 = new JButton("查詢相近年齡"); JLabel = new JLabel("輸入身份證號或者地址查詢"); JLabel.setBounds(750, 50, 400, 30); text=new JTextArea(30,80); text.setBounds(50, 180, 650, 700); text1=new JTextArea(1,30); text1.setBounds(750, 100, 300, 40); text2=new JTextArea(30,80); text2.setBounds(750,180,700, 800); text3=new JTextArea(30,80); text3.setBounds(400,100,300,40); Button1.addActionListener(new Action()); Button1.setBounds(50,50,300,40); Button2.addActionListener(new Action1()); Button2.setBounds(400,50,300,40); Button3.addActionListener(new Action2()); Button3.setBounds(50,100,300,40); Panel.add(JLabel); Panel.add(Button1); Panel.add(Button2); Panel.add(Button3); Panel.add(text); Panel.add(text1); Panel.add(text2); Panel.add(text3); add(Panel); Timer timer = new Timer(); TimerTask timeTask=new TimerTask() { @Override public void run() { // TODO Auto-generated method stub text2.setText(null); String place=text1.getText().toString().trim(); //查詢同鄉 for (int i = 0; i <Personlist.size(); i++) { String Str=(String)Personlist.get(i).getbirthplace(); if(Str.contains(place)&&!place.equals("")) { text2.append(Personlist.get(i).toString()); } } //查詢身份證號碼 for (int i = 0; i <Personlist.size(); i++) { String Str=(String)Personlist.get(i).getID(); if(Str.contains(place)&&!place.equals("")) { text2.append(Personlist.get(i).toString()); } } } };timer.schedule(timeTask, 0,100); Personlist = new ArrayList<>(); try { FileInputStream fis = new FileInputStream(file); BufferedReader in = new BufferedReader(new InputStreamReader(fis)); String temp = null; while ((temp = in.readLine()) != null) { Scanner linescanner = new Scanner(temp); linescanner.useDelimiter(" "); String name = linescanner.next(); String ID = linescanner.next(); String sex = linescanner.next(); String age = linescanner.next(); String place =linescanner.nextLine(); Person Person = new Person(); Person.setname(name); Person.setID(ID); Person.setsex(sex); int a = Integer.parseInt(age); Person.setage(a); Person.setbirthplace(place); Personlist.add(Person); } } catch (FileNotFoundException e) { System.out.println("查找不到信息"); e.printStackTrace(); } catch (IOException e) { System.out.println("信息讀取有誤"); e.printStackTrace(); } } //排序 private class Action implements ActionListener { public void actionPerformed(ActionEvent event) { text.setText(null); Collections.sort(Personlist); text.append(Personlist.toString()); } } //查詢最大年齡和最小年齡 private class Action1 implements ActionListener { public void actionPerformed(ActionEvent event) { text.setText(null); int max=0,min=100;int j,k1 = 0,k2=0; for(int i=1;i<Personlist.size();i++) { j=Personlist.get(i).getage(); if(j>max) { max=j; k1=i; } if(j<min) { min=j; k2=i; } } text.append("最大年齡: "+Personlist.get(k1)+"\n"+"最小年齡: "+Personlist.get(k2)); } } //查找相近年齡 private class Action2 implements ActionListener { public void actionPerformed(ActionEvent event) { text.setText(null); int a = Integer.parseInt(text3.getText().toString().trim()); int d_value=a-Personlist.get(agenear(a)).getage(); for (int i = 0; i < Personlist.size(); i++) { int p=Personlist.get(i).getage()-a; if(p==d_value||-p==d_value) text.append(Personlist.get(i).toString()); } } } public static int agenear(int age) { int j=0,min=53,d_value=0,k=0; for (int i = 0; i < Personlist.size(); i++) { d_value=Personlist.get(i).getage()-age; if(d_value<0) d_value=-d_value; if (d_value<min) { min=d_value; k=i; } } return k; } } Main
package xinxi; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Toolkit; import javax.swing.JFrame; public class out { public static void main (String args[]) { Toolkit t=Toolkit.getDefaultToolkit(); Dimension s=t.getScreenSize(); EventQueue.invokeLater(() -> { JFrame frame = new Main(); frame.setBounds(0, 0,(int)s.getWidth(),(int)s.getHeight()); frame.setTitle("xinxi"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }); } } out
package xinxi; public class Person implements Comparable<Person> { private String name; private String ID; private int age; private String sex; private String birthplace; public String getname() { return name; } public void setname(String name) { this.name = name; } public String getID() { return ID; } public void setID(String ID) { this.ID= ID; } public int getage() { return age; } public void setage(int age) { this.age= age; } public String getsex() { return sex; } public void setsex(String sex) { this.sex= sex; } public String getbirthplace() { return birthplace; } public void setbirthplace(String birthplace) { this.birthplace= birthplace; } public int compareTo(Person o) { return this.name.compareTo(o.getname()); } public String toString() { return name+"\t"+sex+"\t"+age+"\t"+ID+"\t"+birthplace+"\n"; } } Person
練習3:採用GUI界面設計如下程序
l 編寫一個計算器類,能夠完成加、減、乘、除的操做
l 利用計算機類,設計一個小學生100之內數的四則運算練習程序,由計算機隨機產生10道加減乘除練習題,學生輸入答案,由程序檢查答案是否正確,每道題正確計10分,錯誤不計分,10道題測試結束後給出測試總分;
l 將程序中測試練習題及學生答題結果輸出到文件,文件名爲test.txt。
package jisuan; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.FileNotFoundException; import java.io.PrintWriter; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextArea; public class Jisuan extends JFrame { private String[] c=new String[10]; private String[] c1=new String[10]; private int[] list=new int[10]; int i=0,i1=0,sum = 0; private PrintWriter out = null; private JTextArea text,text1; private int counter; public Jisuan() { JPanel Panel = new JPanel();Panel.setLayout(null); JLabel JLabel1=new JLabel("");JLabel1.setBounds(500, 800, 400, 30);JLabel1.setFont(new Font("Courier",Font.PLAIN,35)); JButton Button = new JButton("生成題目");Button.setBounds(50,150,150,50);Button.setFont(new Font("Courier",Font.PLAIN,20)); Button.addActionListener(new Action()); JButton Button2 = new JButton("肯定答案");Button2.setBounds(300,150,150,50);Button2.setFont(new Font("Courier",Font.PLAIN,20));Button2.addActionListener(new Action1()); JButton Button3 = new JButton("讀出文件");Button3.setBounds(500,150,150,50);Button3.setFont(new Font("Courier",Font.PLAIN,20));Button3.addActionListener(new Action2()); text=new JTextArea(30,80);text.setBounds(30, 50, 200, 50);text.setFont(new Font("Courier",Font.PLAIN,35)); text1=new JTextArea(30,80);text1.setBounds(270, 50, 200, 50);text1.setFont(new Font("Courier",Font.PLAIN,35)); Panel.add(text); Panel.add(text1); Panel.add(Button); Panel.add(Button2); Panel.add(Button3); Panel.add(JLabel1); add(Panel); } private class Action implements ActionListener { public void actionPerformed(ActionEvent event) { text1.setText("0"); if(i<10) { int a = 1+(int)(Math.random() * 99); int b = 1+(int)(Math.random() * 99); int m= (int) Math.round(Math.random() * 3); switch(m) { case 0: while(a<b){ b = (int) Math.round(Math.random() * 100);a = (int) Math.round(Math.random() * 100); } c[i]=(i+":"+a+"/"+b+"="); list[i]=Math.floorDiv(a, b); text.setText(i+":"+a+"/"+b+"="); i++; break; case 1: c[i]=(i+":"+a+"*"+b+"="); list[i]=Math.multiplyExact(a, b); text.setText(i+":"+a+"*"+b+"="); i++; break; case 2: c[i]=(i+":"+a+"+"+b+"="); list[i]=Math.addExact(a, b); text.setText(i+":"+a+"+"+b+"="); i++; break ; case 3: while(a<=b){ b = (int) Math.round(Math.random() * 100);a = (int) Math.round(Math.random() * 100); } c[i]=(i+":"+a+"-"+b+"="); text.setText(i+":"+a+"-"+b+"="); list[i]=Math.subtractExact(a, b);i++; break ; } } } } private class Action1 implements ActionListener { public void actionPerformed(ActionEvent event) { if(i<10) { text.setText(null); String daan=text1.getText().toString().trim(); int a = Integer.parseInt(daan); if(text1.getText()!="") { if(list[i1]==a) sum+=10; } c1[i1]=daan; i1++; } } } private class Action2 implements ActionListener { public void actionPerformed(ActionEvent event) { try { out = new PrintWriter("text.txt"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } for(int counter=0;counter<10;counter++) { out.println(c[counter]+c1[counter]); } out.println("成績"+sum); out.close(); } } } Jisuan
package jisuan; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Toolkit; import javax.swing.JFrame; public class math { public static void main (String args[]) { Toolkit t=Toolkit.getDefaultToolkit(); Dimension s=t.getScreenSize(); EventQueue.invokeLater(() -> { JFrame frame = new Jisuan(); frame.setBounds(0, 0,(int)s.getWidth()/2,(int)s.getHeight()/2); frame.setTitle("produce by 楊野"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }); } } math
任務3:本學期課程已結束,請彙總《面向對象程序設計課程學習進度條》的數據,統計我的專業能力提高的數據。並從學習內容、學習方法、學習心得幾個方面進行課程學習總結,也但願你對課程的不足提出建議和意見。
總結:JAVA特色:簡單的、面向對象的、分佈式的、強壯的、安全的、體系結構中立的、可移植的、解釋型的、高性能的、多線程的、動態的語言。
源文件的命名規則:若是源文件中有多個類,那麼只能有一個類是 public類。若是有一個類是public類,那麼源文件的名字必須與這個類的名字徹底相同,擴展名是.java。若是源文件沒有public類,那麼源文件的名字只要和某個類的名字相同,而且擴展名是.java就能夠了。
Java流程控制語句:控制語句: if語句, switch語句.循環語句 :while , do…while ,for break和continue語句 :break——跳出switch結構;終止並跳出循環體。continue——結束本次循環。
類體內容由兩部分構成:類成員變量:用來刻畫類屬性;類成員方法:用來刻畫類內操做。
局部變量:在方法體中定義的變量和方法的參數被稱爲局部變量。類成員變量和局部變量的區別:類成員變量在整個類內都有效,局部變量只在定義它的方法內有效。若是局部變量的名字與成員變量的名字相同,則成員變量被隱藏。
類成員方法:方法的定義包括兩部分:方法聲明和方法體。構造方法:名字必須與類名徹底相同,沒有返回值類型;構造方法能夠重載;每一個類至少有一個構造方法,若程序員沒有定義構造方法,系統會自動產生一個默認構造方法,這個默認構造方 法無參數,方法體爲空;程序員爲類定義了構造方法,系統就再也不提供默認構造方法;用途:初始化類對象。
方法重載:一個類中能夠有多個具備相同的名字的方法。但這些方法或者是參數的個數不一樣,或者是參數的類型不一樣。
建立對象需兩個步驟:對象聲明和爲對象分配內存。
Static關鍵字:用static修飾的成員變量稱爲類(靜態)變量,用static修飾的方法稱爲類(靜態)方法。實例變量和類變量的區別:若是類的成員變量有類變量,那麼該類全部對象的類變量內存是相同的。具備訪問權限的類變量能夠經過某個對象訪問,也能夠經過類名訪問。具備訪問權限的實例變量僅能夠經過對象訪問,不能使用類名訪問。實例方法和類方法的區別:實例方法能夠被類建立的任何對象調用執行。類方法不只能夠被類建立的任何對象調用執行,也能夠直接經過類名調用
this關鍵字:this表示類的當前對象。this能夠出如今實例方法和構造方法中,但不能夠出如今類方法中。this關鍵字出如今構造方法中時,表明使用該構造方法所建立的對象。this出如今類的實例方法中時,表明正在調用該方法 的當前對象。
實現類繼承的方式:在類的聲明中,經過使用關鍵字extends來建立一個類的子類。Java只支持單繼承,不容許多繼承 。Java容許有多層繼承。
方法重寫是指:子類中定義一個方法,這個方法的名字、返回類型、參數個數和類型與從父類繼承的方法徹底相同。子類重寫父類,被重寫的方法不能比父類擁有更嚴格的訪問權限
super關鍵字:子類中訪問父類中被隱藏的成員變量,super.成員變量,子類調用父類中的方法。調用父類中的特定構造方法 super() ,調用父類中被重寫的方法 super.方法()
多態性有兩種表現形式:①方法的多態性(方法重載)②對象的多態性。對象多態性是在繼承應用上的一種擴展
final關鍵字:final關鍵子可修飾類、方法成員、成員變量和方法中的參數。final類不能被繼承,即不能有子類。方法被修飾爲final方法,則這個方法不能被重寫。一個成員變量被修飾爲final的,就是常量,常量必須 賦給初值,並且不能再發生變化。方法的參數被修飾爲final的,該參數的值不能被改變。
抽象類:用關鍵字abstract修飾的類稱爲abstract類(抽象類)。 abstract類不能被實例化; abstract類能夠有abstract方法;對於abstract方法,只容許聲明,不容許實現,且要用 abstract關鍵字進行修飾;抽象類的子類必須重寫全部的抽象方法。
接口的聲明與使用:關鍵字interface來定義一個接口。接口的定義與類的定義類似,包括接口的聲明和接口體。接口體中包含常量定義和抽象方法定義兩部分。接口使用規則:一個類能夠實現多個接口;若是一個類使用了某個接口,那麼這個類必須實現該接口的全部方法,即爲這些方法提供方法體。
方法的權限訪問修飾符: public,protected ,default(不加訪問說明符時), private。方法的其它修飾符 static ,final ,abstract ,synchronized。
類和類之間關係:is a: 繼承,實現關係。has a: 組合,聚合,關聯關係。use a: 依賴關係
拋出異常:throws語句是在方法的聲明中使用來拋出異常,用來指定方法可能拋出異常,但不想在當前方法中處理這個異常。throw語句是在方法體內使用拋出異常類的對象,程序在執行到throw語句時當即終止,它後面的語句都不執行。要捕捉throw拋出的異常,則必須使用try-catch語句。
Java中的每一個事件類都有一個相應的監視器接口,接口中聲明瞭一個或多個抽象的事件處理 方法。若是一個類實現事件監視器接口,其對象就能夠做爲對應事件的監視器,具有監視和處理事件的能力。
多線程機制是Java語言的重要特徵之一,使用多線程技術可使系統同時運行多個執行體,加快程序的響應時間,提升計算機資源的利用率。使用多線程技術能夠提升整個應用系統的性能。
程序、進程與線程的區別:程序是一段靜態的代碼,它是應用軟件執行的藍本。進程是程序的一次動態執行過程,它對應了從代碼加載、執行至執行完畢的一個完整過程,這個過程也是進程自己從產生、發展至消亡的過程。線程是比進程更小的執行單位,一個進程在其執行過程當中,能夠產生多個線程,造成多條執行線索,每條線索,即每一個線程也有它自身的產生、存在和消亡的過 程,也是一個動態的概念。
多線程和多任務:多線程和多任務是兩個既有聯繫又有區別的概念。多任務是針對操做系統而言的,表明着操做系統能夠同時執行的程序個數;多線程是針對一個程序而言的,表明着一個程序內部能夠同時執行的線程個數,而每一個線程能夠完成不一樣的任務。
線程的狀態與生命週期:新建:當一個Thread類或其子類的對象被聲明並建立時,新生的線程對象處於新建狀態。此時它已經有了佔用內存空間和其餘資源的資格。運行:線程建立以後就具有了運行的條件,一旦輪到它來享用CPU資源時,即JVM將CPU使用權切換給該線程時,此線程的就能夠脫離建立它的主線程獨立開始本身的生命週期了(即run方法執行的過程)。阻塞:有3種緣由的阻塞:等待阻塞:執行了wait() 方法;同步阻塞:獲取synchronized同步鎖失敗;其餘阻塞:執行了sleep()、join()方法;終止:run方法結束。
建立線程的方式有兩種:經過建立Thread類的子類來實現;經過實現Runnable接口的類來實現。
Thread的子類建立線程的關鍵操做:設計Thread的子類,重寫父類的run方法,用Thread類或子類建立線程對象,使用start方法啓動線程,JVM將CPU使用權切換給線程時,自動執行 run方法。
經過Runnable接口實現多線程的關鍵操做:設計一個實現Runnable接口的類,重寫run方法;以該類的對象爲參數創建Thread類的對象;調用Thread類對象的start方法啓動線程,將執行權轉交到run方法。
通過一學期Java課的學習,對Java這門語言有了進一步的認識,但學習Java之路還很漫長。老師的教學方式對咱們學習Java有很大的幫助,也感謝助教在百忙之中抽時間爲咱們解疑。