杨玲201771010133《面向对象程序设计(java)》第十六周学习总结
《面向对象程序设计(java)》第十六周学习总结
第一部分:理论知识学习部分
1、程序是一段静态的代码,它是应用程序执行的蓝本。进程是程序的一次动态执行,它对应了从代码加载、执行至执行完毕的一个完整过程。操作系统为每个进程分配一段独立的内存空间和系统资源,包括:代码数据以及堆栈等资源。每一个进程的内部数据和状态都是完全独立的。多任务操作系统中,进程切换对CPU资源消耗较大。
2、多线程是进程执行过程中产生的多条执行线索。线程是比进程执行更小的单位。线程不能独立存在,必须存在于进程中,同一进程的各线程间共享进程空间的数据。每个线程有它自身的产生、存在和消亡的过程,是一个动态的概念。多线程意味着一个程序的多行语句可以看上去几乎在同一时间内同时运行。线程创建、销毁和切换的负荷远小于进程,又称为轻量级进程。
3、Java实现多线程有两种途径:创建Thread类的子类;在程序中定义实现Runnable接口的类。
4、用Thread类的子类创建线程:首先需从Thread类派生出一个子类,在该子类中重写run()方法。然后用创建该子类的对象Lefthand left=new Lefthand(); Righthand right=new Righthand();最后用start()方法启动线程 left.start(); right.start();
5、用Thread类的子类创建多线程的关键性操作:定义Thread类的子类并实现用户线程操作,即run()方法的实现。在适当的时候启动线程。由于Java只支持单重继承,用这种方法定义的类不可再继承其他父类。
6、用Runnable()接口实现线程:首先设计一个实现Runnable接口的类;然后在类中根据需要重写run方法;再创建该类对象,以此对象为参数建立Thread 类的对象;调用Thread类对象的start方法启动线程,将 CPU执行权转交到run方法。
7、Thread(Runnable r):创建一个新线程,它调用r的run(), r是一个实现了Runnable接口的类的实例。
8、线程两种创建方法比较:实现Runnable接口的优势:符合OO设计的思想;便于用extends继承其它类。采用继承Thread类方法的优点:代码简单。
9、线程的终止:当线程的run方法执行方法体中最后一条语句后,或者出现了在run方法中没有捕获的异常时,线程将终止,让出CPU使用权。调用interrupt()方法也可终止线程。 void interrupt() :向一个线程发送一个中断请求,同时把这个线程的“interrupted”状态置为true。若该线程处于 blocked 状 态,会抛出 InterruptedException。/10、测试线程是否被中断的方法:static boolean interrupted() :检测当前线程是否已被中断,并重置状态 “interrupted”值为false。 boolean isInterrupted() :检测当前线程是否已被中断 , 不改变状态 “interrupted”值 。
二 实验部分
第二部分:实验部分
实验名称:实验十六 线程技术
1、实验目的与要求
(1) 掌握线程概念;
(2) 掌握线程创建的两种技术;
(3) 理解和掌握线程的优先级属性及调度方法;
(4) 掌握线程同步的概念及实现技术;
2、实验内容和步骤
实验1:测试程序并进行代码注释。
测试程序1:
l 在elipse IDE中调试运行ThreadTest,结合程序运行结果理解程序;
l 掌握线程概念;
l 掌握用Thread的扩展类实现线程的方法;
l 利用Runnable接口改造程序,掌握用Runnable接口创建线程的方法。
class Lefthand extends Thread {
public void run()
{
for(int i=0;i<=5;i++)
{ System.out.println("You are Students!");
try{ sleep(500); }
catch(InterruptedException e)
{ System.out.println("Lefthand error.");}
}
}
}
class Righthand extends Thread {
public void run()
{
for(int i=0;i<=5;i++)
{ System.out.println("I am a Teacher!");
try{ sleep(300); }
catch(InterruptedException e)
{ System.out.println("Righthand error.");}
}
}
}
public class ThreadTest
{
static Lefthand left;
static Righthand right;
public static void main(String[] args)
{ left=new Lefthand();
right=new Righthand();
left.start();
right.start();
}
}
1class Lefthand extends Thread { 2publicvoid run() 3 { 4for(int i=0;i<=5;i++) 5 { System.out.println("You are Students!"); 6try{ Thread.sleep(500); } 7catch(InterruptedException e) 8 { System.out.println("Lefthand error.");} 9 } 10 } 11}12class Righthand extends Thread {13publicvoid run()14 {15for(int i=0;i<=5;i++)16 { System.out.println("I am a Teacher!");17try{ Thread.sleep(300); }18catch(InterruptedException e)19 { System.out.println("Righthand error.");}20 }21 }22}23publicclass ThreadTest 24{25static Lefthand left;26static Righthand right;27publicstaticvoid main(String[] args)28 { Runnable left = new Lefthand();29 Runnable right = new Righthand();30 Thread left1 = new Thread(left);31 Thread right1 = new Thread(right);32 left1.start();33 right1.start();34 }35 }
运行结果如下:
测试程序2:
l 在Elipse环境下调试教材625页程序14-1、14-2 、14-3,结合程序运行结果理解程序;
l 在Elipse环境下调试教材631页程序14-4,结合程序运行结果理解程序;
l 对比两个程序,理解线程的概念和用途;
l 掌握线程创建的两种技术。
1package bounceThread; 2 3import java.awt.geom.*;
4
5/**
6 A ball that moves and bounces off the edges of a
7 rectangle
8 * @version 1.33 2007-05-17
9 * @author Cay Horstmann
10*/
11publicclass Ball
12{
13privatestaticfinalint XSIZE = 15;//定义球的大小
14privatestaticfinalint YSIZE = 15;
15privatedouble x = 0;
16privatedouble y = 0;
17privatedouble dx = 1;
18privatedouble dy = 1;
19
20/**
21 Moves the ball to the next position, reversing direction
22 if it hits one of the edges
23*/
24publicvoid move(Rectangle2D bounds)
25 {
26 x += dx;//定义球的运行轨迹大小
27 y += dy;
28if (x < bounds.getMinX())
29 {
30 x = bounds.getMinX();
31 dx = -dx;
32 }
33if (x + XSIZE >= bounds.getMaxX())
34 {
35 x = bounds.getMaxX() - XSIZE;
36 dx = -dx;
37 }
38if (y < bounds.getMinY())
39 {
40 y = bounds.getMinY();
41 dy = -dy;
42 }
43if (y + YSIZE >= bounds.getMaxY())
44 {
45 y = bounds.getMaxY() - YSIZE;
46 dy = -dy;
47 }
48 }
49
50/**
51 Gets the shape of the ball at its current position.
52*/
53public Ellipse2D getShape()
54 {
55returnnew Ellipse2D.Double(x, y, XSIZE, YSIZE);
56 }
57 }
1package bounce; 2 3import java.awt.*;
4import java.util.*;
5import javax.swing.*;
6
7/**
8 * The component that draws the balls.
9 * @version 1.34 2012-01-26
10 * @author Cay Horstmann
11*/
12publicclass BallComponent extends JPanel
13{
14privatestaticfinalint DEFAULT_WIDTH = 450;
15privatestaticfinalint DEFAULT_HEIGHT = 350;
16
17private java.util.List<Ball> balls = new ArrayList<>();
18
19/**
20 * Add a ball to the component.
21 * @param b the ball to add
22*/
23publicvoid add(Ball b)
24 {
25 balls.add(b);
26 }
27
28publicvoid paintComponent(Graphics g)
29 {
30super.paintComponent(g); // 擦除背景
31 Graphics2D g2 = (Graphics2D) g;
32for (Ball b : balls)
33 {
34 g2.fill(b.getShape());
35 }
36 }
37
38public Dimension getPreferredSize() { returnnew Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
39 }
1package bounce; 2 3import java.awt.*;
4import java.awt.event.*;
5import javax.swing.*;
6
7/**
8 * Shows an animated bouncing ball.
9 * @version 1.34 2015-06-21
10 * @author Cay Horstmann
11*/
12publicclass Bounce
13{
14publicstaticvoid main(String[] args)
15 {
16 EventQueue.invokeLater(() -> {
17 JFrame frame = new BounceFrame();
18 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
19 frame.setVisible(true);
20 });
21 }
22}
23
24/**
25 * The frame with ball component and buttons.
26*/
27class BounceFrame extends JFrame
28{
29private BallComponent comp;
30publicstaticfinalint STEPS = 1000;
31publicstaticfinalint DELAY = 3;
32
33/**
34 * Constructs the frame with the component for showing the bouncing ball and
35 * Start and Close buttons
36*/
37public BounceFrame()
38 {
39 setTitle("Bounce");//名称
40 comp = new BallComponent();
41 add(comp, BorderLayout.CENTER);//放在框架居中的位置
42 JPanel buttonPanel = new JPanel();
43 addButton(buttonPanel, "Start", event -> addBall());//将按钮组件添加到事件源容器中
44 addButton(buttonPanel, "Close", event -> System.exit(0));
45 add(buttonPanel, BorderLayout.SOUTH);//设置按钮的位置
46 pack();
47 }
48
49/**
50 * Adds a button to a container.
51 * @param c the container
52 * @param title the button title
53 * @param listener the action listener for the button
54*/
55publicvoid addButton(Container c, String title, ActionListener listener)
56 {
57 JButton button = new JButton(title);
58 c.add(button);
59 button.addActionListener(listener);
60 }
61
62/**
63 * Adds a bouncing ball to the panel and makes it bounce 1,000 times.
64*/
65publicvoid addBall()//以线程的方式
66 {
67try
68 {
69 Ball ball = new Ball();
70 comp.add(ball);
71
72for (int i = 1; i <= STEPS; i++)
73 {
74 ball.move(comp.getBounds());
75 comp.paint(comp.getGraphics());
76 Thread.sleep(DELAY);//休眠给定的毫秒数
77 }
78 }
79catch (InterruptedException e)
80 {
81 }
82 }
83 }
1package bounceThread; 2 3import java.awt.*;
4import java.util.*;
5import javax.swing.*;
6
7/**
8 * The component that draws the balls.
9 * @version 1.34 2012-01-26
10 * @author Cay Horstmann
11*/
12publicclass BallComponent extends JComponent
13{
14privatestaticfinalint DEFAULT_WIDTH = 450;
15privatestaticfinalint DEFAULT_HEIGHT = 350;
16
17private java.util.List<Ball> balls = new ArrayList<>();
18
19/**
20 * Add a ball to the panel.
21 * @param b the ball to add
22*/
23publicvoid add(Ball b)
24 {
25 balls.add(b);
26 }
27
28publicvoid paintComponent(Graphics g)
29 {
30 Graphics2D g2 = (Graphics2D) g;
31for (Ball b : balls)
32 {
33 g2.fill(b.getShape());
34 }
35 }
36
37public Dimension getPreferredSize() { returnnew Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
38 }
1package bounceThread; 2 3import java.awt.*;
4import java.awt.event.*;
5
6import javax.swing.*;
7
8/**
9 * Shows animated bouncing balls.
10 * @version 1.34 2015-06-21
11 * @author Cay Horstmann
12*/
13publicclass BounceThread
14{
15publicstaticvoid main(String[] args)
16 {
17 EventQueue.invokeLater(() -> {
18 JFrame frame = new BounceFrame();
19 frame.setTitle("BounceThread");
20 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
21 frame.setVisible(true);
22 });
23 }
24}
25
26/**
27 * The frame with panel and buttons.
28*/
29class BounceFrame extends JFrame
30{
31private BallComponent comp;
32publicstaticfinalint STEPS = 1000;
33publicstaticfinalint DELAY = 5;
34
35
36/**
37 * Constructs the frame with the component for showing the bouncing ball and
38 * Start and Close buttons
39*/
40public BounceFrame()
41 {
42 comp = new BallComponent();
43 add(comp, BorderLayout.CENTER);
44 JPanel buttonPanel = new JPanel();
45 addButton(buttonPanel, "Start", event -> addBall());
46 addButton(buttonPanel, "Close", event -> System.exit(0));
47 add(buttonPanel, BorderLayout.SOUTH);
48 pack();
49 }
50
51/**
52 * Adds a button to a container.
53 * @param c the container
54 * @param title the button title
55 * @param listener the action listener for the button
56*/
57publicvoid addButton(Container c, String title, ActionListener listener)
58 {
59 JButton button = new JButton(title);
60 c.add(button);
61 button.addActionListener(listener);
62 }
63
64/**
65 * Adds a bouncing ball to the canvas and starts a thread to make it bounce
66*/
67publicvoid addBall()//用匿名内部类
68 {
69 Ball ball = new Ball();
70 comp.add(ball);
71 Runnable r = () -> {
72try
73 {
74for (int i = 1; i <= STEPS; i++)
75 {
76 ball.move(comp.getBounds());
77 comp.repaint();
78 Thread.sleep(DELAY);
79 }
80 }
81catch (InterruptedException e)
82 {
83 }
84 };
85 Thread t = new Thread(r);//构造一个新线程,用于给定目标的run()方法
86 t.start();//启动这个线程,将引发调用run方法。这个方法将立即返回,并且新线程将并发运行
87 }
88 }
运行结果如下:
测试程序3:分析以下程序运行结果并理解程序。
class Race extends Thread {
public static void main(String args[]) {
Race[] runner=new Race[4];
for(int i=0;i<4;i++) runner[i]=new Race( );
for(int i=0;i<4;i++) runner[i].start( );
runner[1].setPriority(MIN_PRIORITY);
runner[3].setPriority(MAX_PRIORITY);}
public void run( ) {
for(int i=0; i<1000000; i++);
System.out.println(getName()+"线程的优先级是"+getPriority()+"已计算完毕!");
}
}
1class Race extends Thread { 2publicstaticvoid main(String args[]) { 3 Race[] runner = new Race[4]; 4for (int i = 0; i < 4; i++) 5 runner[i] = new Race(); 6for (int i = 0; i < 4; i++) 7 runner[i].start(); 8 runner[1].setPriority(MIN_PRIORITY); 9 runner[3].setPriority(MAX_PRIORITY);10 }1112publicvoid run() {
13for (int i = 0; i < 1000000; i++);//延时作用----执行空语句(不释放CPU)
14 System.out.println(getName() + "线程的优先级是" + getPriority() + "已计算完毕!");
15 }
16 }
运行结果如下:
测试程序4
l 教材642页程序模拟一个有若干账户的银行,随机地生成在这些账户之间转移钱款的交易。每一个账户有一个线程。在每一笔交易中,会从线程所服务的账户中随机转移一定数目的钱款到另一个随机账户。
l 在Elipse环境下调试教材642页程序14-5、14-6,结合程序运行结果理解程序;
1package unsynch; 2 3import java.util.*;
4
5/**
6 * A bank with a number of bank accounts.
7 * @version 1.30 2004-08-01
8 * @author Cay Horstmann
9*/
10publicclass Bank
11{
12privatefinaldouble[] accounts;
13
14/**
15 * Constructs the bank.
16 * @param n the number of accounts
17 * @param initialBalance the initial balance for each account
18*/
19public Bank(int n, double initialBalance)
20 {
21 accounts = newdouble[n];
22 Arrays.fill(accounts, initialBalance);
23 }
24
25/**
26 * Transfers money from one account to another.
27 * @param from the account to transfer from
28 * @param to the account to transfer to
29 * @param amount the amount to transfer
30*/
31publicvoid transfer(int from, int to, double amount)
32 {
33if (accounts[from] < amount) return;
34 System.out.print(Thread.currentThread());
35 accounts[from] -= amount;
36 System.out.printf(" %10.2f from %d to %d", amount, from, to);
37 accounts[to] += amount;
38 System.out.printf(" Total Balance: %10.2f%n", getTotalBalance());
39 }
40
41/**
42 * Gets the sum of all account balances.
43 * @return the total balance
44*/
45publicdouble getTotalBalance()
46 {
47double sum = 0;
48
49for (double a : accounts)
50 sum += a;
51
52return sum;
53 }
54
55/**
56 * Gets the number of accounts in the bank.
57 * @return the number of accounts
58*/
59publicint size()
60 {
61return accounts.length;
62 }
63 }
1package unsynch; 2 3/**
4 * This program shows data corruption when multiple threads access a data structure.
5 * @version 1.31 2015-06-21
6 * @author Cay Horstmann
7*/
8publicclass UnsynchBankTest
9{
10publicstaticfinalint NACCOUNTS = 100;
11publicstaticfinaldouble INITIAL_BALANCE = 1000;
12publicstaticfinaldouble MAX_AMOUNT = 1000;
13publicstaticfinalint DELAY = 10;
14
15publicstaticvoid main(String[] args)
16 {
17 Bank bank = new Bank(NACCOUNTS, INITIAL_BALANCE);
18for (int i = 0; i < NACCOUNTS; i++)
19 {
20int fromAccount = i;
21 Runnable r = () -> {
22try
23 {
24while (true)
25 {
26int toAccount = (int) (bank.size() * Math.random());
27double amount = MAX_AMOUNT * Math.random();
28 bank.transfer(fromAccount, toAccount, amount);
29 Thread.sleep((int) (DELAY * Math.random()));
30 }
31 }
32catch (InterruptedException e)
33 {
34 }
35 };
36 Thread t = new Thread(r);//构造一个新线程,用于给定目标的run()方法
37 t.start();//启动这个线程,将引发调用run方法。这个方法将立即返回,并且新线程将并发运行
38 }
39 }
40 }
运行结果如下:
综合编程练习
编程练习1
- 设计一个用户信息采集程序,要求如下:
(1) 用户信息输入界面如下图所示:
(2) 用户点击提交按钮时,用户输入信息显示控制台界面;
(3) 用户点击重置按钮后,清空用户已输入信息;
(4) 点击窗口关闭,程序退出。
1 2 3import java.awt.Dimension;
4import java.awt.FlowLayout;
5import java.awt.GridLayout;
6
7import javax.swing.BorderFactory;
8import javax.swing.ButtonGroup;
9import javax.swing.JButton;
10import javax.swing.JCheckBox;
11import javax.swing.JComboBox;
12import javax.swing.JFrame;
13import javax.swing.JLabel;
14import javax.swing.JPanel;
15import javax.swing.JRadioButton;
16import javax.swing.JTextField;
17
18publicclass DemoJFrame extends JFrame {
19private JPanel jPanel1;
20private JPanel jPanel2;
21private JPanel jPanel3;
22private JPanel jPanel4;
23private JTextField fieldname;
24private JComboBox comboBox;
25private JTextField fieldadress;
26private ButtonGroup bg;
27private JRadioButton Male;
28private JRadioButton Female;
29private JCheckBox read;
30private JCheckBox sing;
31private JCheckBox dance;
32
33public DemoJFrame() {
34// 设置窗口大小
35this.setSize(800, 400);
36// 设置可见性
37this.setVisible(true);
38// 设置标题
39this.setTitle("编程练习一");
40// 设置关闭操作
41this.setDefaultCloseOperation(EXIT_ON_CLOSE);
42// 设置窗口居中
43 WinCenter.center(this);
44// 创建四个面板对象
45 jPanel1 = new JPanel();
46 setJPanel1(jPanel1);
47 jPanel2 = new JPanel();
48 setJPanel2(jPanel2);
49 jPanel3 = new JPanel();
50 setJPanel3(jPanel3);
51 jPanel4 = new JPanel();
52 setJPanel4(jPanel4);
53// 设置容器的为流布局
54 FlowLayout flowLayout = new FlowLayout();
55this.setLayout(flowLayout);
56// 将四个面板添加到容器中
57this.add(jPanel1);
58this.add(jPanel2);
59this.add(jPanel3);
60this.add(jPanel4);
61
62 }
63
64/*
65 * 设置面一
66*/
67privatevoid setJPanel1(JPanel jPanel) {
68// TODO 自动生成的方法存根
69 jPanel.setPreferredSize(new Dimension(700, 45));
70// 给面板的布局设置为网格布局 一行4列
71 jPanel.setLayout(new GridLayout(1, 4));
72
73 JLabel name = new JLabel("name:");
74 name.setSize(100, 50);
75 fieldname = new JTextField("");
76 fieldname.setSize(80, 20);
77
78 JLabel study = new JLabel("qualification:");
79 comboBox = new JComboBox();
80 comboBox.addItem("初中");
81 comboBox.addItem("高中");
82 comboBox.addItem("本科");
83 jPanel.add(name);
84 jPanel.add(fieldname);
85 jPanel.add(study);
86 jPanel.add(comboBox);
87
88 }
89
90/*
91 * 设置面板二
92*/
93privatevoid setJPanel2(JPanel jPanel) {
94// TODO 自动生成的方法存根
95 jPanel.setPreferredSize(new Dimension(700, 50));
96// 给面板的布局设置为网格布局 一行4列
97 jPanel.setLayout(new GridLayout(1, 4));
98
99 JLabel name = new JLabel("address:");
100 fieldadress = new JTextField();
101 fieldadress.setPreferredSize(new Dimension(150, 50));
102
103 JLabel study = new JLabel("hobby:");
104 JPanel selectBox = new JPanel();
105 selectBox.setBorder(BorderFactory.createTitledBorder(""));
106 selectBox.setLayout(new GridLayout(3, 1));
107 read = new JCheckBox("reading");
108 sing = new JCheckBox("singing");
109 dance = new JCheckBox("danceing");
110 selectBox.add(read);
111 selectBox.add(sing);
112 selectBox.add(dance);
113 jPanel.add(name);
114 jPanel.add(fieldadress);
115 jPanel.add(study);
116 jPanel.add(selectBox);
117 }
118
119/*
120 * 设置面板三
121*/
122privatevoid setJPanel3(JPanel jPanel) {
123// TODO 自动生成的方法存根
124 jPanel.setPreferredSize(new Dimension(700, 150));
125 FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT);
126 jPanel.setLayout(flowLayout);
127 JLabel sex = new JLabel("性别:");
128 JPanel selectBox = new JPanel();
129 selectBox.setBorder(BorderFactory.createTitledBorder(""));
130 selectBox.setLayout(new GridLayout(2, 1));
131 bg = new ButtonGroup();
132 Male = new JRadioButton("male");
133 Female = new JRadioButton("female");
134 bg.add(Male );
135 bg.add(Female);
136 selectBox.add(Male);
137 selectBox.add(Female);
138 jPanel.add(sex);
139 jPanel.add(selectBox);
140
141 }
142
143/*
144 * 设置面板四
145*/
146privatevoid setJPanel4(JPanel jPanel) {
147// TODO 自动生成的方法存根
148 jPanel.setPreferredSize(new Dimension(700, 150));
149 FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER, 50, 10);
150 jPanel.setLayout(flowLayout);
151 jPanel.setLayout(flowLayout);
152 JButton sublite = new JButton("提交");
153 JButton reset = new JButton("重置");
154 sublite.addActionListener((e) -> valiData());
155 reset.addActionListener((e) -> Reset());
156 jPanel.add(sublite);
157 jPanel.add(reset);
158 }
159
160/*
161 * 提交数据
162*/
163privatevoid valiData() {
164// TODO 自动生成的方法存根
165// 拿到数据
166 String name = fieldname.getText().toString().trim();
167 String xueli = comboBox.getSelectedItem().toString().trim();
168 String address = fieldadress.getText().toString().trim();
169 System.out.println(name);
170 System.out.println(xueli);
171 String hobbystring="";
172if (read.isSelected()) {
173 hobbystring+="reading ";
174 }
175if (sing.isSelected()) {
176 hobbystring+="singing ";
177 }
178if (dance.isSelected()) {
179 hobbystring+="dancing ";
180 }
181 System.out.println(address);
182if (Male.isSelected()) {
183 System.out.println("male");
184 }
185if (Female.isSelected()) {
186 System.out.println("female");
187 }
188 System.out.println(hobbystring);
189 }
190
191/*
192 * 重置
193*/
194privatevoid Reset() {
195// TODO 自动生成的方法存根
196 fieldadress.setText(null);
197 fieldname.setText(null);
198 comboBox.setSelectedIndex(0);
199 read.setSelected(false);
200 sing.setSelected(false);
201 dance.setSelected(false);
202 bg.clearSelection();
203 }
204}
205
206 DemoJFrame
1 2 3
4
5import java.awt.EventQueue;
6
7import javax.swing.JFrame;
8
9publicclass Main {
10publicstaticvoid main(String[] args) {
11 EventQueue.invokeLater(() -> {
12 DemoJFrame page = new DemoJFrame();
13 });
14 }
15}
16
17 Main
1 2 3import java.awt.Dimension;
4import java.awt.Toolkit;
5import java.awt.Window;
6
7publicclass WinCenter {
8publicstaticvoid center(Window win){
9 Toolkit tkit = Toolkit.getDefaultToolkit();
10 Dimension sSize = tkit.getScreenSize();
11 Dimension wSize = win.getSize();
12if(wSize.height > sSize.height){
13 wSize.height = sSize.height;
14 }
15if(wSize.width > sSize.width){
16 wSize.width = sSize.width;
17 }
18 win.setLocation((sSize.width - wSize.width)/ 2, (sSize.height - wSize.height)/ 2);
19 }
20}
21
22 WinCenter
运行结果如下:、
2.创建两个线程,每个线程按顺序输出5次“你好”,每个“你好”要标明来自哪个线程及其顺序号。
1class xian extends Thread { 2publicvoid run() 3 { 4for(int i=1;i<=5;i++) 5 { System.out.println( i+ " (1 : 你好)" ); 6try{ sleep(200); } 7catch(InterruptedException e)//异常捕获 8 { System.out.println("Lefthand error.");}
9 }
10 }
11 }
12
13class xian2 extends Thread {
14publicvoid run()
15 {
16for(int i=1;i<=5;i++)
17 { System.out.println( i+ " ( 2 : 你好)");
18try{ sleep(200); }
19catch(InterruptedException e)//异常捕获
20 { System.out.println("Lefthand error.");}
21 }
22 }
23
24 }
25publicclass xiancheng
26 {
27//属性
28static xian1 xian11;
29static xian2 xian22;
30publicstaticvoid main(String[] args)
31 { xian11=new xian1();
32 xian22=new xian2();
33//用start()方法启动线程
34 xian11.start();
35 xian22.start();
36 }
37 }
运行结果如下:
3. 完善实验十五 GUI综合编程练习程序。
4. 实验总结:
通过这次实验我掌握线程的概念;掌握了线程创建的两种技术;也理解和掌握了线程的优先级属性及调度方法;还 掌握了线程同步的概念及实现技术,继续加油!
以上是 杨玲201771010133《面向对象程序设计(java)》第十六周学习总结 的全部内容, 来源链接: utcz.com/z/508994.html