先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
正文
88、请写出 package 语句和 import 语句的区别。
89、.请写出与数组相比, Vccto 对象的特点。
90、 请写出用 Thread 类的子类创建线程并启动线程所包含的步骤。
91、请写出 Java 语言中的事件处理机制。
92、说出开发与运行 Java 程序的主要步骤。
答:安装 SUN 的 JDK,配置 classpath
编写源文件。
编译。
运行
93、如何区分应用程序和小应用程序。
答:应用程序必须在一类中定义一个 main()方法,该方法代表应用程序
94、
95、
96、
97、用 final 修饰符修饰的类和方法有什么特点?
用 final 修饰的类不能被继承,即不能有子类。 (2.5 分)
用 final 修饰的方法不能被重写 (2.5 分)
98、一个 Java Applet 的生命周期包括什么?
一个 Java Applet 的执行过程称为这个 Java Applet 的生命周期 (2 分)
一个完整的 Java Applet 所包含 5 个方法 init( ) 、start( ) (1 分)
stop( ) 、destroy( ) (1 分)
paint(Graphics g) (1 分)
99、Java 中多线程是如何调度的 ?
线程调度器负责线程的排队和处理器在线程间的分配 (2.5 分)
线程在优先级基础上依据 "先到先服务 "的原则 ,即相同优先级的线程按启动的先后顺序
执行 ,高优先级线程先于低优先级运行 (2.5 分)
100、
101、
102、
# 103、 简述 java 语言的特点 ? 1.2
Java 语言是目前使用最为广泛的网络编程语言之一 (1 分)
具有面向对象 (1 分)
与平台无关性 (1 分)
多线程性 (1 分)
动态性等特点 (1 分)
104、Java 中共有哪些基本数据类型? 2.2
基本类型共有 8 种,分四类分别是 (1 分)
逻辑型 (1 分)
字符型 (1 分)
整型 (1 分)
浮点型 (1 分)
105、Java 中数据类型分别用什么符号来表示的? 2.2
逻辑型用 boolean 表示 (1 分)
字符型用 char 表示 (1 分)
整型共有 4 种分别是 byte 、short 、long 、int (2 分)
浮点型共两种 float 和 double (1 分)
106、Java 中结构化程序设计有哪三种基本流程,及分别对应 java 中那些语句? 3.2
结构化程序设计有顺序、分支、循环三种基本流程 (2 分)
java 中的分支语句包括 if 语句、 switch 语句; (1 分)
循环语句包括 while 语句、 do-while 语句、 for 语句; (1 分)
其他如对象、变量定义语句、赋值语句、方法调用语句等都是顺序语句。
107、简述编程语言的几个发展阶段? 4.1
(1)面向机器语言 (1 分)
(2)面向过程语言 (1 分)
(3)结构化程序设计阶段 (1 分)
(4)面向对象编程 (2 分)
108、什么是方法重载? 4.2
方法重载是指,一个类中可以有多个方法具有相同的名字和类型( 2 分)
但这些方法的参数必须不同 (1 分)
或者是参数个数不同,或者是参数类型不同 (2 分)
109、什么是构造方法? 4.2
构造方法是一种特殊方法 (1 分)
它的名字必须与它所在的类的名字完全相同 (2 分)
并且不返回任何数据类型,即它是 void 型 (2 分)
110、简述什么是类的继承机制? 4.5
继承是一种由已有的类创建新类的机制 (1 分)
利用继承可以创建一个共有属性的一般类, 根据该一般类再创建具有特殊属性的
新类 (1 分)
新类继承一般类的状态和行为,并根据需要增加它自己的新的状态和行
为 (1 分)
由继承而得到的类称为子类 (1 分)
被继承的类称为父类 (1 分)
111、
112、21.已知整型变量 n,当 n 的值为 0 时,输出“正常”,否则输出“异常”。请写出使用 switch语句实现此功能的代码。
答 :
113、22.请写出在类、方法、变量之前加上修饰字 final 的作用
答 :
114、23.请列举出能产生 ActionEvent 事件类型的 3种组件。
答 :
115、24.某程序用以下代码弹出一个对话框:
如果程序中 anwser 的值等于 CLOSED_OPTION ,请写出用户对该对话框的操作内容。
答 :
116、25.请写出用矩形类 Rectangle2D 创建对象 r 的代码,对象 r 的左上角坐标是 (20 ,30) ,宽是 50,高是 70
答 :
117、
答 :
118、21.请写出表示以下条件的表达式:变量 x 的值为 1 与变量 y 的值为 2,有且只有一个成立。
答 :
119、22.请写出通过继承创建子类的作用。
答 :
120、23.请写出将文本区 text1 和 text2 放置于面板 P,并创建放置 P的滚动面板 jsp ,最后将jsp 添加到 JFrame 子窗口 myFrame的 Java 语句。
答 :
121、请写出 Java 小应用程序播放音频文件需要用到的类的类名,以及创建相应对象的方法。
答 :
122、25.请写出 Java 系统提供的支持文件随机访问的类的类名,以及该类提供的读取一个整数的方法
答 :
123、26.请写出 URL对象能实现的功能。
答 :
124、以下语句有一处错误,请改正,然后写出此循环语句的循环次数。
答 :
125、使用 super 有哪三种情况 ?
答 :
126、在 Java 的 GUI编程中,有哪三种窗口类型 ?
答 :
127、请写出向窗口增设菜单的步骤。
答 :
128、请写出绘制左上角为 (150,150),半径为 80 的绿色圆形的语句。设调用的对象是类型为 Graphics 的 g。
答 :
129、请写出使用 socket 与另一方进行通信会话的过程。
答 :
130、
答 :
131、22.请写出接口体中可能包含的内容。
答 :
132、23.请写出对事件对象作监视器注册的作用。
答 :
133、24.已知 Graphics 对象 g,获得 Graphics2D 对象 g2d,然后,用圆角长方形类创建对象 circle ,该对象的左上角坐标是 (30,40) ,半径是 50。请写出实现以上要求的 Java 代 码。
答 :
134、25.某程序希望用 FileFilter 类的子类为打开文件对话框设置文件筛选条件。 请写出设置 此筛选条件要使用的类及相应的方法。
答 :
135、26.JDBC 是 Java 程序与数据库连接的 API。请写出 JDBC能做的三件事情。
答 :
136、
答 :
137、为了系统安全,对 JavaApplet 小应用程序有什么限制 ?
答 :
138、请写出声明 int 类型的二维数组 intArr 的三种形式。
答 :
139、请写出在 JFrame 框架窗口对象中添加组件的步骤。
答 :
140、请写出使用 Graphics2D 类声明并创建一个左上角为 (20 ,30) 、边长为 50 的正方形对象 square 的语句。
答 :
141、请写出使用纯 Java JDBC 驱动程序连接数据库的步骤。
答 :
142、
答 :
143、22请写出final类、final方法和final变量各自的含义
答 :
144、
答 :
145、
答 :
146、25请写出sleep()和wait()的区别
答 :
147、
答 :
148、21请写出表示条件“y 右移一位后大于 3 并且 y 不等于 0”成立的 Java 表达式。
答 :
149、22. 请写出类之间的 is-a 关系和类之间的 has-a 关系的含义。
答 :
150、23. 请写出 GridLayout 布局的三种构造方法
答 :
# 151、24. 请写出使用 Graphics2D 类声明并创建一个左上角为 (30 ,40) ,宽是 80,高为 50 的椭圆对象 ellipse 的语句。
152、25. 请写出采用缓冲式输出时,程序由文件名创建缓冲式输出流的步骤。
153、26. 请写出数据库更新操作中,删除数据表记录的 3 种方案各自所使用的对象
154、
155、
156、32.阅读下列程序,请写出该程序的输出结果。
答 :
157、
158、
答 :
159、35.阅读下列程序,请写出该程序的功能。
答 :
160、
答 :
161、
答 :
162、
163、
164、
165、
答 :
166、
167、
168、 请编写方法 int countNum(String str) ,该方法的功能是统计已知字符串 str 中数字的个数。例如,
countNum(“A42B83C2D”) 的返回值是 5
答 :
169、. 一个小应用程序,界面如下图所示,其功能为实现摄氏温度和华氏温度的相互转换。以下是程序的大部分,
请编写其中的监视器方法。
答 :
170、
171、
172、
173、
174、
175、
176、
177、
178、
答 :
179、
180、
181、
答 :
182、
183、
184、
185、
186、
187、
188、
189、
阅读下列程序,请回答以下问题:
(1)该程序的菜单条中共有几个菜单项 ?
(2)单击哪个菜单项,可以打开一个对话框 ?
(3)该对话框是强制型还是非强制型 ?
(4)该对话框中显示的是什么内容 ?
Import javax.swing.*;import java.awt.*;
import java.awt.event.*; import java.util.*;
class MyDialog extends JDialog {
MyDialog (JFrame F, String s) {
super( F, s, false); Date date = new Date() ;
String t = date.toString () ; JLabel text = new JLabel (t);
add(text) ; setSize(200,100); setVisible(true);
}
}
public class MenuDemo extends JFrame implements ActionListener {
JMenuBar menubar; JMenu action;
JMenuItem show, set, quit;
public MenuDemo () {
menubar = new JMenuBar () ; setJMenuBar(menubar) ;
action = new JMenu ( '‘操作 ‘’); menubar.add(action);
show= new JMenuItem (’'显示 ‘’), action.add(show);
set = new JMenuItem ("设置 "); action.add(set);
action.addSeparator() ; quit = new JMenuItem ( "退出 ");
action.add(quit); show.addActionListener (this);
set.addActionListener (this); quit.addActionListener ( this);
setSize(300,300); setVisible(true);
}
public void actionPerformed (ActionEvent e ) {
if(e.getSource() == show) {MyDialog diag = new MyDialog ( this, "信息 ");}
else if(e.getSource() == set) { this.setTitle ("菜单演示 ");}
else if(e.getSource() == quit ) { System.exit(0); }
}
public static void main (String[] args ) {new MenuDemo () ;}
}
190、
class InputNoNameDialog extends JDialog implements ActionListener{
JLabel title ;JTextField textl ,text2, mainText;JButton done;
InputNoNameDialog(JFrame f ,String s,JTextField t) {
super(f,s, true); mainText = t ;Container con = getContentPane() ;
title=new JLabel(s) ; textl=new JTextField(10) ;
text2=new JTextField(10) ; con.setLayout(new GridLayout(3,2)) ;
con.setSize(200,100); setModal(false) ;
//请在以下位置续写其余代码
答: done=new JButton(" 确定 “);
done.addActionListener(this);
con.add(title);con.add(done);
con.add(new JLabel(” 学号 “));con.add(textl);
con.add(new JLabel(” 姓名 "));con.add(text2);
setVisible(true); }
public void actionPerformed(ActionEvent e) {
//输入结束按确定按钮后,将对话框中输入的学号和姓名在它依赖窗口的文本框中显示。
mainText.setText(″学号:″ +textl.getText()+ ″ 姓名:″ +text2.getText()) ;
setVisible(false) ;dispose();
}
}
191、阅读下列程序,请写出该程序的功能。
import javax.swing.*; import java.awt.*; import java.awt.event.*;
滑动滚动条的滑块,
在文本框显示块 位
置对应的数值
class MyScrollBar extends JScrollBar {
public MyScrollBar(int init, int len, int low, int high){
super(JScrollBar.HORIZONTAL, init, len, low, high);
}
public Dimension getPreferredSize(){
return new Dimension(125, 20);
}
}
class MyWindow extends JFrame implements AdjustmentListener{
private JTextField text;
MyWindow(String s){
super(s);
MyScrollBar tempBar = new MyScrollBar(l0, 10, 0, 255);
Container con = this.getContentPane();
con.setLayout(new GridLayout(2,1));
this.setSize(250, 100); this.setLocation(100, 100);
tempBar.addA djustmentListener(this);
text= new JTextField(" 移动滚动条的滑块 ",20);
con.add(text); con.add(tempBar); this.setVisible(true); this.pack();
}
public void adjustmentValueChanged(AdjustmentEvent e){
MyScrollBar myBar=(MyScrO11Bar)e.getAdjustable() ;
text.setText("选择的值是: “+myBar.getValue()) ;
}
}
public class Test35 {
public static void main(String[] args) { new MyWindow(” 滚动条示意程序 "); }
}
191、以下程序创建了一个窗口,然后在窗口内显示″ Hello ,World! ″。
import javax.swing.* ; import java .awt* ;
public class HelloWorld {
public static void main(String[ ]ares) {
TextFrame frame=new TextFrame() ;
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
frame. ____ setVisable(true)____;
}
}
class TextFrame extends JFrame {
public TextFrame() { .
setTitle(″HelloWorld ″);
setSize(WIDTH ,HEIGHT) ;
TextPanel panel=new TextPanel();
Container contentPane=getContentPane();
contentPane.add(panel);
}
public static final int WIDTH=300 ;
public static final int HEIGHT= 200 ;
}
class TextPanel extends JPanel {
public void paintComponent(Graphics g) {
super. ___ paintComponent(g) _____;
g.drawString( ″Hello ,World! ″, x,y);
}
public int x=100 ; public int y=100 ;
}
192、阅读下列程序,请写出该程序的功能。
import java.applet.* :import java.awt.event.* ;import javax.swing.*
public class Class 1 extends Applet implements KeyListener{
JButton button=new JButton( ″开始″ );
JTextArea text=new JTextArea(5 ,20);
public void init() {
button.addKeyListener(this) ; add(button);add(text) ;
}
public void keyPressed(KeyEvent e){
int t=e.getKeyCode() ;
if(t>=KeyEvent.VK_A&& t<=KeyEvent.VK_Z) {
text.append(″ ″+(char)t);
}
}
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e){}
}
193、
194、某小应用程序的界面有两个按钮, 点击 “画圆 ”按钮, 程序在窗口画一个圆, 点击 “画矩形 ”按钮,程序在窗口画一个矩形。
import java.applet.*; import java.awt.*;
import java.awt.event.*;import javax.swing.*;
public class Classl extends Applet implements ActionListener {
boolean c = false; int r = 50,a = 50, b = 50;
JButton bl, b2;
public void init(){
setSize(200, 200); setBackground(Color.blue);
b1 = new JButton(" 画 圆"); b2 = new JButton(" 画矩形 ");
b1.addActionListener(this); b2.addActionListener(this);
add(b1); add(b2); setVisible(true);
}
public void (Graphics g){
g.clearRect(70, 100, 130, 200);
g.setColor(Color. red);
if© g.drawRoundRect(70, 100, r, r, r, r);
else g.drawRect(70, 100, a, b);
}
public void update(Graphics g){ paint(g); }
public void actionPerformed(ActionEvent e){
if(e.getSource()==b1) { c = true; }
else if(e.getSource()==b2){ c = false; }
;
}
}
195、阅读下列程序,请写出该程序的功能。
import java.applet.*; import javax.swing.*;
import java.awt.*; import java.awt.event.*;
public class Test34 extends Applet implements ActionListener {
JTextField text;int r; JPanel panel;
public void paint (Graphics g){
Graphics gc = panel.getGraphics () ;
gc.clearRect(0,0, panel.getWidth() , panel.getHeight());
gc.setColor(Color.red); gc.fillOval ( 10, 10, r, r);
}
public void init () {
text = new JTextField (10); panel = new JPanel() ;
setSize(200, 100) ; setLayout(new GridLayout (2,1)) ;
add(text); add(panel); text.addActionListener (this);
}
public void actionPerformed (ActionEvent e ) {
if ( e.getSource() == text) {
r = Integer.parseInt(text.getText());
repaint() ;
}
}
}
196、阅读下列程序,请写出该程序的功能。
import java.applet.* ; import java.awt.* ;
public class Test36 extends java.applet.Applet implements Runnable{
Thread myThread = null ;
double seta=0.0;
public void start() {
setSize(500,400);
if(myThread=null){ myThread=new Thread(this) ; myThread.start() ;}
}
public void run() {
while(myThread!=null) {
try {myThread.sleep(40) ;
} catch(InterruptedException e){}
seta+=3.0; if(seta>=360)seta=0; repaint();
}
}
public void paint(Graphics g) {
final double pi=3.14159 ; final double r = 100.0 ;
int x0=250+(int)(r*Math.cos(3.1415926/180.0*seta)) ;
int y0=200+(int)(r*Math.sin(3.1415926/180.0*seta)) ;
g.setColor(Color.red) ; g.drawOval(x0 ,y0,10,10);
}
以 文 本 框 输 入 的
数 字 为 半 径 ,( 1
分)以( 10, 10)
为左上角,(1 分)
填充一个红色( 1
分)的圆。(1 分)
}
答:红色、顺时针画圆
197、
198、阅读下列程序,请写出该程序的功能。
import java.applet.*; import java.awt.*;
public class Class1 extends java.applet.Applet implements Runnable {
Thread myThread = null;
public void start() {
setSize(500, 400);
if (myThread == null) {
myThread = new Thread(this); myThread.start();
}
}
public void run() {
while (myThread != null) {
try { myThread.sleep(500);
} catch (InterruptedException e) { }
repaint();
}
}
public void paint(Graphics g) {
int x = (int)(400*Math.random());
int y = (int)(300*Math.random());
g.setColor(Color.red); g.fillOval(x,y, 10, 10);
}
}
随机绘制外切矩形为 10 红色的圆
199、
198、阅读下列程序,请写出该程序的功能。
import java util.*;
class MyThread extends Thread {
int pauseTime; String name;
public MyThread (int x, String n) { pauseTime = x; name = n; }
public void run() {
for(int i = 1;i <= 4; i++) {
try {
Current thread(1 分 )
After name change(1 分)
3
2
1(2 分)
System.out.println(name +“:” +new Date(System.currentTimeMillis()));
Thread.sleep(pauseTime);
}catch(Exception e){ }
}
}
}
public class Test36{
static public void main(String[] args) {
MyThread thread1 = new MyThread (1000,“Fast Thread”); thread 1 .start();
MyThread thread2 = new MyThread (3000,“Slow Thread”); thread2.start();
}
199、
200、
201、
202、
203、
204、
205、
206、
207、21.请写出表示以下条件的表达式:变量 x 的值为 1 与变量 y 的值为 2,有且只有一个成立。
208、22.请写出通过继承创建子类的作用。
209、23.请写出将文本区 text1 和 text2 放置于面板 P,并创建放置 P的滚动面板 jsp,最后将jsp 添加到 JFrame子窗口 myFrame 的 Java语句。
210、24. 请写出 Java小应用程序播放音频文件需要用到的类的类名,以及创建相应对象的方法
211、25.请写出 Java系统提供的支持文件随机访问的类的类名,以及该类提供的读取一个整数的方法。
212、26.请写出 URL对象能实现的功能。
213、
214、
215、
216、
217、30.类 ShareDataManager 用于管理多个线程共享数据 data,其中定义了一个供线程修改 data 的方法 modiData() 。为了
对 data 的修改操作保持完整,多线程在 data上的操作 有互斥要求;另外,限制线程对 data的修改不能让 data为负
数,所以多线程在 data 上的操作还有同步要求。以下是类 ShareDataManager 的定义
218、31.某个缓冲式输出的示意程序的界面有一个文本框 fileOut 和一个文本区 text,程序运 行时, 先在文本区中输入要存入文件的内容,接着在文本框中输入文件名并回车, 则程序将文本区中的内容保存到指定的文件中。以下是该程序中相应文本框文件名 的输入事件的方法
219、
220、
221、
222、
223、
224、
225、
226、
227、
228、
229、什么是继承?
答:通过必要的说明能够实现某个类无需重新定义就拥有另一个类的某些属性和方法,并把这种关系称为继承,先定义的类称为父类,后定义的类称为子类,并
且允许多层的继承关系。
230、
231、
232、
233、
234、
235、
236、
237、
238、
239、
240、阅读下列程序,请写出该程序的输出结果。
class Tree {
private String name;public boolean flower;
public int birthYear;
Tree(String n, boolean f, int y){ name = n; flower = f; birthYear = y; }
public void setName(String n){name = n;}
public String getName(){return name; }
public void printTree(String str){
System.out.println(str); System.out.println(“Name:”+name);
System.out.println(“Birth Year:”+birthYear);
System.out.println(“Flower:”+flower);
}
}
class PineTree extends Tree {
public boolean coniferous = true;
PineTree(String n, boolean f, int y, boolean c){super(n, f, y);coniferous = c; }
public void printTree(String str){
super, printTree(str);
System.out.println(“Coniferous:” + coniferous);
}
}
class Test32 {
public static void main(String []args){
Tree fOb = new Tree(“May Flower”, true, 1980);
PineTree sOb = new PineTree(“Pine”, false, 2000, true);
fOb.printTree(" fOb:"); sOb.printTree(“sOb:”);
}
}
参考答案: fOb:
Name:May Flower
Birth Year:1980
Flower:true
sOb:
Name:Pine
Birth Year:2000
Flower:false
Coniferous:true
241、阅读下列程序,请写出该程序的功能。
import java.applet.*; import javax.swing.*;
import java.awt.*; import java.awt.event.*;
public class Test34 extends Applet implements ActionListener {
JTextField text;int r; JPanel panel;
public void paint(Graphics g){
Graphics gc = panel.getGraphics();
gc.clearRect(0,0, panel.getWidth(), panel.getHeight());
gc.setColor(Color.red); gc.fillOval(10, 10, r, r);
}
public void init() {
text = new JTextField(10); panel = new JPanel();
setSize(200, 100); setLayout(new GridLayout(2,1));
add(text); add(panel); text.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == text) {
r = Integer.parseInt(text.getText());
repaint();
}
}
}
参考答案:以文本框输入的数字为半径,以( 10,10)为左上角,填充一个红色的圆。
242、阅读下列程序,请回答以下问题:
(1) 该程序的菜单条中共有几个菜单项 ?
(2) 单击哪个菜单项,可以打开一个对话框 ?
(3) 该对话框是强制型还是非强制型 ?
(4) 该对话框中显示的是什么内容 ?
Import javax.swing.*;import java.awt.*;
import java.awt.event.*; import java.util.*;
class MyDialog extends JDialog {
MyDialog(JFrame F, String s) {
super(F, s, false); Date date = new Date();
String t = date.toString(); JLabel text = new JLabel(t);
add(text); setSize(200,100); setVisible(true);
}
}
public class MenuDemo extends JFrame implements ActionListener {
JMenuBar menubar; JMenu action;
JMenuItem show, set, quit;
public MenuDemo() {
menubar = new JMenuBar(); setJMenuBar(menubar);
action = new JMenu(‘’ 操作 ‘’) ; menubar.add(action);
show= new JMenuItem(‘’ 显示 ‘’), action.add(show);
set = new JMenuItem(" 设置 “); action.add(set);
action.addSeparator(); quit = new JMenuItem(” 退出 ");
action.add(quit); show.addActionListener(this);
set.addActionListener(this); quit.addActionListener(this);
setSize(300,300); setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == show) {MyDialog diag = new MyDialog(this, " 信息 “);}
else if(e.getSource()== set) { this.setTitle(” 菜单演示 ");}
else if(e.getSource() == quit){ System.exit(0); }
}
public static void main(String[] args) {new MenuDemo();}
}
参考答案:
( 1)3 个菜单项
(2)“显示”菜单项
(3)非强制型对话框
(4)显示当前事件
243、
class CurrentThreadDemo {
public static void main(String args[]) {
Thread t = new Thread(); System.out.println(“Current thread”);
t.setName(“My Thread”); System.out.println(“After name change”);
try {for(int n = 3; n > 0; n–) {
System.out.println(n); Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println(“Main thread interrupted”);
}
}
}
参考答案: urrent thread(1 分)
After name change(1 分)
3
2
1(2 分
244、
245、
246、
247、
248、
249、请设计实现如下用于输入学号和姓名的对话框界面, 其中空白格是文本框, 用于输入相应的内容。
250、
251、多线程有什么⽤?
1)发挥多核CPU的优势
随着⼯业的进步,现在的笔记本、台式机乃⾄商⽤的应⽤服务器⾄少也都是双核的,4核、8核甚⾄16核的也都不少⻅,如果是单
线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。 单核CPU上所谓的"多线程"那是假的多线程,同⼀
时间处理器只会处理⼀段逻辑,只不过线程之间切换得⽐较快,看着像多个线程"同时"运⾏罢了。多核CPU上的多线程才是真正
的多线程,它能让你的多段逻辑同时⼯作,多线程,可以真正发挥出多核CPU的优势来,达到充分利⽤CPU的⽬的。
2)防⽌阻塞
从程序运⾏效率的⻆度来看,单核CPU不但不会发挥出多线程的优势,反⽽会因为在单核CPU上运⾏多线程导致线程上下⽂的切
换,⽽降低程序整体的效率。但是单核CPU我们还是要应⽤多线程,就是为了防⽌阻塞。试想,如果单核CPU使⽤单线程,那么
只要这个线程阻塞了,⽐⽅说远程读取某个数据吧,对端迟迟未返回⼜没有设置超时时间,那么你的整个程序在数据返回回来之
前就停⽌运⾏了。多线程可以防⽌这个问题,多条线程同时运⾏,哪怕⼀条线程的代码执⾏读取数据阻塞,也不会影响其它任务
的执⾏。
3)便于建模
这是另外⼀个没有这么明显的优点了。假设有⼀个⼤的任务A,单线程编程,那么就要考虑很多,建⽴整个程序模型⽐较⿇烦。
但是如果把这个⼤的任务A分解成⼏个⼩任务,任务B、任务C、任务D,分别建⽴程序模型,并通过多线程分别运⾏这⼏个任
务,那就简单很多了。
创建线程的方式
⽐较常⻅的⼀个问题了,⼀般就是两种:
1)继承Thread类
2)实现Runnable接⼝
⾄于哪个好,不⽤说肯定是后者好,因为实现接⼝的⽅式⽐继承类的⽅式更灵活,也能减少程序之间的耦合度, ⾯向接⼝编程也
是设计模式6⼤原则的核⼼。
3、start()⽅法和run()⽅法的区别
只有调⽤了start()⽅法,才会表现出多线程的特性,不同线程的run()⽅法⾥⾯的代码交替执⾏。如果只是调⽤run()⽅法,那么
代码还是同步执⾏的,必须等待⼀个线程的run()⽅法⾥⾯的代码全部执⾏完毕之后,另外⼀个线程才可以执⾏其run()⽅法⾥⾯
的代码。
4、Runnable接⼝和Callable接⼝的区别
有点深的问题了,也看出⼀个Java程序员学习知识的⼴度。
Runnable接⼝中的run()⽅法的返回值是void,它做的事情只是纯粹地去执⾏run()⽅法中的代码⽽已;Callable接⼝中的call()
⽅法是有返回值的,是一个泛型,和Future、FutureTask配合可以⽤来获取异步执⾏的结果。
这其实是很有⽤的⼀个特性,因为 多线程相比单线程更难、更复杂的一个重要原因就是因为多线程充满着未知性,某条线程是否
执行了?某条线程执⾏了多久?某条线程执⾏的时候我们期望的数据是否已经赋值完毕?⽆法得知,我们能做的只是等待这条多
线程的任务执行完毕而已。而Callable+Future/FutureTask却可以获取多线程运行的结果,可以在等待时间太⻓没获取到需要的
数据的情况下取消该线程的任务,真的是⾮常有⽤。
CyclicBarrier和CountDownLatch的区别
两个看上去有点像的类,都在java.util.concurrent下,都可以用来表示代码运行到某个点上,二者的区别在于:
1)CyclicBarrier的某个线程运行到某个点上之后,该线程即停⽌运⾏,直到所有的线程都到达了这个点,所有线程才重新运
⾏;CountDownLatch则不是,某线程运行到某个点上之后,只是给某个数值-1而已,该线程继续运行。
2)CyclicBarrier只能唤起一个任务,CountDownLatch可以唤起多个任务。
3) CyclicBarrier可重用,CountDownLatch不可重⽤,计数值为0该CountDownLatch就不可再⽤了。
什么是线程安全
最好的: 如果你的代码在多线程下执行和在单线程下
执行永远都能获得一样的结果,那么你的代码就是线程安全的。
这个问题有值得⼀提的地⽅,就是线程安全也是有⼏个级别的:
1)不可变
像String、Integer、Long这些,都是final类型的类,任何⼀个线程都改变不了它们的值,要改变除⾮新创建⼀个,因此这些不
可变对象不需要任何同步⼿段就可以直接在多线程环境下使⽤
2)绝对线程安全
不管运⾏时环境如何,调⽤者都不需要额外的同步措施。要做到这⼀点通常需要付出许多额外的代价,Java中标注⾃⼰是线程安
全的类,实际上绝⼤多数都不是线程安全的,不过绝对线程安全的类,Java中也有,比如说CopyOnWriteArrayList、
CopyOnWriteArraySet
3)相对线程安全
相对线程安全也就是我们通常意义上所说的线程安全,像Vector这种,add、remove⽅法都是原⼦操作,不会被打断,但也仅
限于此,如果有个线程在遍历某个Vector、有个线程同时在add这个Vector,99%的情况下都会出现
ConcurrentModificationException,也就是 fail-fast机制。
4)线程非安全
这个就没什么好说的了,ArrayList、LinkedList、HashMap等都是线程⾮安全的类
Java中如何获取到线程dump文件
死循环、死锁、阻塞、页面打开慢等问题,打线程dump是最好的解决问题的途径。所谓线程dump也就是线程堆栈,获取到线
程堆栈有两步:
1)获取到线程的pid,可以通过使用jps命令,在Linux环境下还可以使⽤ps -ef | grep java
2)打印线程堆栈,可以通过使用jstack pid命令,在Linux环境下还可以使用kill -3 pid
另外提提点,Thread类提供了一个getStackTrace()用法也可以⽤于获取线程堆栈。这是一个实例用法,因此此⽅法是和具体线
程实例绑定的,每次获取获取到的是具体某个线程当前运⾏的堆栈。
一个线程如果出现了运行时异常会怎么样
如果这个异常没有被捕获的话,这个线程就停⽌执⾏了。另外重要的一点是: 如果这个线程持有某个某个对象的监视器,那么这
个对象监视器会被立即释放
如何在两个线程之间共享数据
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
线程安全也是有⼏个级别的:
1)不可变
像String、Integer、Long这些,都是final类型的类,任何⼀个线程都改变不了它们的值,要改变除⾮新创建⼀个,因此这些不
可变对象不需要任何同步⼿段就可以直接在多线程环境下使⽤
2)绝对线程安全
不管运⾏时环境如何,调⽤者都不需要额外的同步措施。要做到这⼀点通常需要付出许多额外的代价,Java中标注⾃⼰是线程安
全的类,实际上绝⼤多数都不是线程安全的,不过绝对线程安全的类,Java中也有,比如说CopyOnWriteArrayList、
CopyOnWriteArraySet
3)相对线程安全
相对线程安全也就是我们通常意义上所说的线程安全,像Vector这种,add、remove⽅法都是原⼦操作,不会被打断,但也仅
限于此,如果有个线程在遍历某个Vector、有个线程同时在add这个Vector,99%的情况下都会出现
ConcurrentModificationException,也就是 fail-fast机制。
4)线程非安全
这个就没什么好说的了,ArrayList、LinkedList、HashMap等都是线程⾮安全的类
Java中如何获取到线程dump文件
死循环、死锁、阻塞、页面打开慢等问题,打线程dump是最好的解决问题的途径。所谓线程dump也就是线程堆栈,获取到线
程堆栈有两步:
1)获取到线程的pid,可以通过使用jps命令,在Linux环境下还可以使⽤ps -ef | grep java
2)打印线程堆栈,可以通过使用jstack pid命令,在Linux环境下还可以使用kill -3 pid
另外提提点,Thread类提供了一个getStackTrace()用法也可以⽤于获取线程堆栈。这是一个实例用法,因此此⽅法是和具体线
程实例绑定的,每次获取获取到的是具体某个线程当前运⾏的堆栈。
一个线程如果出现了运行时异常会怎么样
如果这个异常没有被捕获的话,这个线程就停⽌执⾏了。另外重要的一点是: 如果这个线程持有某个某个对象的监视器,那么这
个对象监视器会被立即释放
如何在两个线程之间共享数据
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-QXH8Okl4-1713137056310)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!