一、实验目的
- 掌握多线程的概念及其方法
- 学习编写简单的多线程应用程序
- 了解多线程的运行原理与周期
实验内容:
必做
1.完成教材P386页J_Thread例题和J_ThreadRunnable 例题,理解线程的创建。
package ex14;
public class J_Thread extends Thread {
private int m_threadID;
//定义私有的整形变量;
public J_Thread(int i) {
m_threadID = i;
System.out.println("创建线程"+i);
}//构造有参方法为 变量赋值
//重写Run方法
public void run() {
for(int i = 0;i<3;i++) {
System.out.println("运行线程:"+m_threadID);
try {
Thread.sleep((int)(Math.random()*1000));
}catch(InterruptedException e ) {
System.err.println("异常InterruptedException:"+e);
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new J_Thread(1).start();
new J_Thread(2).start();
System.out.println("方法main结束");
}
}
运行结果:
package ex14;
public class J_ThreadRunnable implements Runnable{
private int m_threadID;
public J_ThreadRunnable(int i) {
m_threadID=i;
System.out.println("创建线程:"+i);
}
public void run() {
for(int i = 0;i<3;i++) {
System.out.println("运行线程:"+m_threadID);
try {
Thread.sleep((int)(Math.random()*1000));
}catch(InterruptedException e){
System.err.println("异常InterruptedException:"+e);
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new J_ThreadRunnable(1));
t1.start();
Thread t2 = new Thread(new J_ThreadRunnable(1));
t2.start();
System.out.println("方法main结束");
}
}
运行截图:
2. 学习采用Thread类和Runnalbe接口两种方法编写线程程序。分别用两种方式编写多线程功能的程序,此程序创建两个线程,第一个线程输出5句
“你好,我的名字是张三,第1次来这儿”
“你好,我的名字是张三,第2次来这儿”
“你好,我的名字是张三,第3次来这儿”
……
第二个线程输出5句
“你好,我的名字是李四,第1次来这儿”
“你好,我的名字是李四,第2次来这儿”
“你好,我的名字是李四,第3次来这儿”
package ex14;
public class RunnableTest implements Runnable {
private String name;
public RunnableTest(String name) {
this.name = name;
}
public void run() {
for(int i = 0;i<5;i++) {
System.out.println("你好,我的名字是"+name+",第"+(i+1)+"次来这儿");
try {
Thread.sleep((int)(Math.random()*1000));
}catch(InterruptedException e){
System.err.println("异常InterruptedException:"+e);
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new RunnableTest("张三"));
Thread t2 = new Thread(new RunnableTest("李四"));
t1.start();
t2.start();
}
}
package ex14;
public class ThreadTest extends Thread{
private String name;//定义名字为String类型变量
public ThreadTest(String s) {
name = s;
}//有参构造方法为变量赋值
public void run() {
for(int i = 0;i<5;i++) {
System.out.println("你好,我的名字是"+name+",第"+(i+1)+"次来这儿");
try {
Thread.sleep((int)(Math.random()*1000));
}catch(InterruptedException e ) {
System.err.println("异常InterruptedException:"+e);
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new ThreadTest("张三").start();
new ThreadTest("李四").start();
}
}
运行截图:
3. 用多线程实现一个简单动画,效果为一个球由小到大,从屏幕左侧滚动到右侧。
参考于:https://blog.csdn.net/weixin_58527373/article/details/117751589
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
//继承JPanel并实现Runnable接口
public class BallCartoon extends JPanel implements Runnable{
int ovalsize=10; //小球大小
int ovalX=0; //小球的X坐标
int ovalY=740; //小球的Y坐标
public void paint(Graphics g) { //绘图
// TODO Auto-generated method stub
super.paint(g);
g.setColor(Color.GRAY); //设置小球颜色
g.fillOval(ovalX, ovalY, ovalsize, ovalsize); //画小球(X坐标,Y坐标,宽,高)
}
static BallCartoon drawArea=new BallCartoon(); //创建绘图区域
public void init() { //组装视图
JFrame frame=new JFrame(); //创建JFrame对象frame
drawArea.setPreferredSize(new Dimension(1450,750)); //设置绘图区域大小(宽,高)
frame.add(drawArea); //将画图区域添加到frame中
frame.pack(); //设置frame大小为最佳大小
frame.setVisible(true); //设置frame为可见
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置默认关闭方式
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
if(ovalX>=1450-ovalsize) //若小球运动到区域边界则结束循环
break;
else
ovalX+=10; //每次X坐标加10
ovalY-=10; //每次Y坐标减10
ovalsize+=10; //每次小球大小增加10
this.repaint(); //每次都要重绘小球
try {
Thread.sleep(100); //每100ms执行一次(刷新率)
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new BallCartoon().init(); //调用init()方法组装视图
Thread t1=new Thread(drawArea); //以drawArea为对象创建线程
t1.start(); //启动线程
}
}