java的模型
A. java的內存模型是怎麼設計的
先來畫一個簡圖,java內存模型可以這樣分類:
packagecom.wyq.Memory;
publicclassPerson{
publicStringname;//成員變數,存放在棧中
publicstaticintage;//static類型的變數,存放在靜態變數區
publicstaticfinalStringsex="女";//常量在常量池中
publicPerson(Stringname){
this.name=name;
}
publicvoidwalk(Personperson){//傳入一個person引用,存放在棧中
intstep=5;//局部變數,基本數據類型,存放在棧中
System.out.println(person.name+"跑了"+step+"步");
}
publicstaticvoidmain(String[]args){
Personperson=newPerson("樓主");//由構造器new一個person對象,存放在堆中
person.walk(person);
}
}
//整個代碼在代碼區中
B. java並發(1)線程模型
程序並不能單獨運行,只有將程序裝載到內存中,系統為它分配資源才能運行,而這種執行的程序就稱之為進程。程序和進程的區別就在於:程序是指令的集合,它是進程運行的靜態描述文本;進程是程序的一次執行活動,屬於動態概念
主要歸咎於兩點. 一個是由實現決定的,一個是由需求決定的.
線程由線程ID,程序計數器(PC)[用於指向內存中的程序指令],寄存器集合[由於存放本地變數和臨時變數]和堆棧[用於存放方法指令和方襪拍法參數等]組成。
以 Unix/Linux 的體系架構為例。
因為操作系統的資源納神是有限的,如果訪問資源的操作過多,必然會消耗過多的資源,而且如果不對這些操作加以區分,很可能造成資源訪問的沖突。所以,為了減少有限資源的訪問和使用沖突,對不同的操作賦予不同的執行等級(有多大能力做多大的事),用戶態(User Mode)和內核態(Kernel Mode)。
運行於用戶態的進程可以執行的操作和訪問的資源都會受到極大的限制,而運行在內核態的進程則可以執行任何操作並且在資源的使用上洞好虧沒有限制。
並發 :一個時間段內有很多的線程或進程在執行,但何時間點上都只有一個在執行,多個線程或進程爭搶時間片輪流執行。
並行 :一個時間段和時間點上都有多個線程或進程在執行。
線程有三種模型, 一對一,多對一,多對多.具體參考 一篇文章讀懂Java多線程模型 , 這里只描述一對一的情況.
每個用戶線程都映射到一個內核線程,每個線程都成為一個獨立的調度單元,由內核調度器獨立調度,一個線程的阻塞不會影響到其他線程,從而保障整個進程繼續工作.
JVM 沒有限定 Java 線程需要使用哪種線程模型來實現, JVM 只是封裝了底層操作系統的差異,而不同的操作系統可能使用不同的線程模型,例如 Linux 和 windows 可能使用了一對一模型,solaris 和 unix 某些版本可能使用多對多模型。所以一談到 Java 語言的多線程模型,需要針對具體 JVM 實現。
Sun JDK 1.2開始,線程模型都是基於操作系統原生線程模型來實現,它的 Window 版和 Linux 版都是使用系統的 1:1 的線程模型實現的。
C. java 的表格模型是什麼
DefaultTableModel是常用的java表格模型。
參考代碼:
packagecom.sd;
importjava.awt.BorderLayout;
importjava.awt.Container;
importjava.awt.Point;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.InputEvent;
importjava.awt.event.MouseAdapter;
importjava.awt.event.MouseEvent;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.util.Arrays;
importjava.util.Vector;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
importjavax.swing.JScrollPane;
importjavax.swing.JTable;
importjavax.swing.JTextField;
importjavax.swing.ListSelectionModel;
importjavax.swing.event.TableModelEvent;
importjavax.swing.event.TableModelListener;
importjavax.swing.table.DefaultTableModel;
importjavax.swing.table.JTableHeader;
importjavax.swing.table.TableColumnModel;
/**
*表格模型事件示例
*<p>
*<li>,
*,orotherwiseinteracts
*withacomponent.,
*-boxismadevisible.
*
*.
*
*@authorHAN
*
*/
{
/**
*
*/
=-8581492063632813033L;
publicTableModel(){
//TODOAuto-generatedconstructorstub
finalContainercontainer=getContentPane();
Vector<String>tableColumnNames=newVector<String>();
tableColumnNames.add("A");
tableColumnNames.add("B");
Vector<Vector<String>>tableValues=newVector<Vector<String>>();
for(inti=1;i<5;i++){
Vector<String>vector=newVector<String>();
vector.add("A"+i);
vector.add("B"+i);
tableValues.add(vector);
}
=newDefaultTableModel(
tableValues,tableColumnNames);
finalJTabletable=newJTable(defaultTableModel);
JScrollPanescrollPane=newJScrollPane();
scrollPane.setViewportView(table);
container.add(scrollPane,BorderLayout.CENTER);
JPanelpanel=newJPanel();
container.add(panel,BorderLayout.SOUTH);
JLabellabelA=newJLabel("A:");
finalJTextFieldtextFieldA=newJTextField(15);
JLabellabelB=newJLabel("B:");
finalJTextFieldtextFieldB=newJTextField(15);
JButtonbuttonAdd=newJButton("添加");
JButtonbuttonDel=newJButton("刪除");
JButtonbuttonDeselected=newJButton("取消選擇");
panel.add(labelA);
panel.add(textFieldA);
panel.add(labelB);
panel.add(textFieldB);
panel.add(buttonAdd);
panel.add(buttonDel);
panel.add(buttonDeselected);
buttonAdd.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
//TODOAuto-generatedmethodstub
int[]selectedRows=table.getSelectedRows();//table
//默認情況容許多行選擇
Vector<String>rowData=newVector<String>();
rowData.add(textFieldA.getText());
rowData.add(textFieldB.getText());
if(selectedRows.length==0){
defaultTableModel.addRow(rowData);
textFieldA.setText(null);
textFieldB.setText(null);
}elseif(selectedRows.length==1){
// System.out.println(selectedRows[0]);
defaultTableModel.insertRow(selectedRows[0]+1,rowData);
textFieldA.setText(null);
textFieldB.setText(null);
}else{
JOptionPane.showMessageDialog(container,
"Youroperationisforbidden","Warning",
JOptionPane.WARNING_MESSAGE);
}
}
});
buttonDel.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
//TODOAuto-generatedmethodstub
int[]selectedRows=table.getSelectedRows();//table
//默認情況容許多行選擇
for(inti=0;i<selectedRows.length;i++){
// System.out.println(selectedRows[i]);
defaultTableModel.removeRow(selectedRows[i]-i);
}
}
});
buttonDeselected.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
//TODOAuto-generatedmethodstub
table.clearSelection();
}
});
scrollPane.addMouseListener(newMouseAdapter(){
@Override
publicvoidmouseClicked(MouseEvente){
// System.out.println("here");
if(e.getClickCount()==1
&&e.getButton()==MouseEvent.BUTTON1){
table.clearSelection();
}
}
});
//
addWindowFocusListener(newWindowAdapter(){
@Override
publicvoidwindowGainedFocus(WindowEvente){
//TODOAuto-generatedmethodstub
textFieldA.requestFocus();
}
});
//**************************************************************
//
//Excel
//**************************************************************
//rowselectionmode
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
//columnselectionmode
=table.getColumnModel();
tableColumnModel.getSelectionModel().setSelectionMode(
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
//allowthecolumnselection()
table.setColumnSelectionAllowed(true);
finalJTableHeadertableHeader=table.getTableHeader();
tableHeader.addMouseListener(newMouseAdapter(){
@Override
publicvoidmouseClicked(MouseEvente){
//TODOAuto-generatedmethodstub
//,
//suchasALT,CTRL,META.
if(e.getClickCount()==1
&&e.getButton()==MouseEvent.BUTTON1){
//Pointpoint=newPoint(e.getX(),e.getY());
Pointpoint=newPoint(e.getPoint());
intcolumnNum=tableHeader.columnAtPoint(point);
//System.out.println(columnNum);
int[]selectedColumns=table.getSelectedColumns();
if(selectedColumns.length!=0){
//System.out.println("here1");
//System.out.println(InputEvent.getModifiersExText(e.getModifiersEx()));
if(e.getModifiersEx()==(InputEvent.CTRL_DOWN_MASK)){
// System.out.println("ctrl");
if(Arrays.binarySearch(selectedColumns,columnNum)>=0){
table.removeColumnSelectionInterval(columnNum,
columnNum);
}else{
table.addColumnSelectionInterval(columnNum,
columnNum);
}
}elseif(e.getModifiersEx()==(InputEvent.SHIFT_DOWN_MASK)){
//System.out.println("shift");
table.setColumnSelectionInterval(
selectedColumns[0],columnNum);
}else{
table.setColumnSelectionInterval(columnNum,
columnNum);
}
}else{
//System.out.println("here2");
table.setColumnSelectionInterval(columnNum,columnNum);
}
table.setRowSelectionInterval(0,table.getRowCount()-1);
}
}
});
defaultTableModel.addTableModelListener(newTableModelListener(){
publicvoidtableChanged(TableModelEvente){
//TODOAuto-generatedmethodstub
inttype=e.getType();
intfirstRow=e.getFirstRow();
// intlastRow=e.getLastRow();//
intcolumn=e.getColumn();
switch(type){
caseTableModelEvent.DELETE:
System.out.print("此次事件由刪除行觸發:");
System.out.println("此次刪除的是第"+firstRow+"行");
break;
caseTableModelEvent.INSERT:
System.out.print("此次事件由插入行觸發:");
System.out.println("此次插入的是第"+firstRow+"行");
break;
caseTableModelEvent.UPDATE:
System.out.print("此次事件由更新行觸發:");
System.out.println("此次更新的是第"+firstRow+"行第"+column+"列");
break;
default:
System.out.println("此次事件由其他原因觸發");
}
}
});
}
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
TableModelframe=newTableModel();
frame.setTitle("表格模型事件示例");
frame.pack();//Realizethecomponents.
// frame.setBounds(100,100,600,300);
// textFieldA.requestFocus();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);//Displaythewindow.
}
}
D. java內存模型的介紹
Java平台自動集成了線程以及多處理器技術,這種集成程度比Java以前誕生的計算機語言要厲害很多,該語言針對多種異構平台的平台獨立性而使用的多線程技術支持也是具有開拓性的一面,有時候在開發Java同步和線程安全要求很嚴格的程序時,往往容易混淆的一個概念就是內存模型。究竟什麼是內存模型?內存模型描述了程序中各個變數(實例域、靜態域和數組元素)之間的關系,以及在實際計算機系統中將變數存儲到內存和從內存中取出變數這樣的底層細節,對象最終是存儲在內存裡面的,這點沒有錯,但是編譯器、運行庫、處理器或者系統緩存可以有特權在變數指定內存位置存儲或者取出變數的值。【JMM】(Java Memory Model的縮寫)允許編譯器和緩存以數據在處理器特定的緩存(或寄存器)和主存之間移動的次序擁有重要的特權,除非程序員使用了final或synchronized明確請求了某些可見性的保證。