java中的多线程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java中的多线程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3380字,纯文字阅读大概需要5分钟。
内容图文
![java中的多线程](/upload/InfoBanner/zyjiaocheng/621/dce3a9d02b0942c4a1f1132d1f64a103.jpg)
一、概念
一个程序可以同时执行多个任务,一个任务叫做一个线程;线程也可以理解为执行的流程,对一个事物可以加上多线程,使得任务效率大大提高。
二、创建线程
先让一个类去继承Thread类,在类中重写run方法,在run方法中加入需要执行的代码。创建好线程类之后,new一个线程的对象,然后用start方法去启动线程。需要注意的是,启动线程并不是使用run方法,如果使用run方法,就相当于执行了一个普通的方法。
public class Test extends Thread {
private String name;
//构造器,传入名字
public Test(String name) {
this.name = name;
}
public void run() {
while(true) {
//写入需要执行的代码
System.out.println(name+"在学习");
try {
Thread.sleep(1000);//这是写入线程执行的间隔(ms),即上一个线程执行完成,到启动下一个线程的时间
}catch(Exception ef) {
ef.printStackTrace();
}
}
}
}
public class Manage {
public static void main(String[] args) {
Test test = new Test();//创建线程类的对象
test.start();//启动线程,注意,必须是调用对象的start方法
}
}
一个程序的线程执行的先后是不一定的,也就是说,对于相同的执行代码和顺序的启动线程,最后的完成的顺序可能不是按启动线程的顺序。上面线程类的代码不做改变,仅改变主函数所在类
public class Manage {
public static void main(String[] args) {
Test test = new Test("小明");
Test test1 = new Test("小陈");
Test test2 = new Test("小王");
test.start();
test1.start();
test2.start();
}
}
最后的输出结果是这样的
完成的顺序并没有严格按照线程启动的顺序,这也就是说,线程的启动是靠cpu调度的。
三、多线程
那对于一个程序来说,如何体现它的线程,换句话来说,如何直观的看到程序是用多个线程运行的。下面通过在窗口上画小球来说明。
先创建一个窗口,并给窗口加上鼠标监听器,此时我们不创建线程类
窗口类:
public class Fly extends JFrame {
public void showUI() {
this.setSize(800, 1000);
this.setTitle("画小球");
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
this.setVisible(true);
Graphics g = this.getGraphics();
Listener listener = new Listener(g);
this.addMouseListener(listener);
}
public static void main(String[] args) {
Fly fly = new Fly();
fly.showUI();
}
}
鼠标监听器类:
public class Listener implements MouseListener {
private Graphics g;
public Listener(Graphics g) {
this.g = g;
}
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {
int x = e.getX();
int y = e.getY();
for(int i = 0;i<50;i++) {
g.fillOval(x, y-i, 20, 20);
try {
Thread.sleep(300);
}catch(Exception ef) {
ef.printStackTrace();
}
}
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
}
因为我们没有创建线程,目前程序是单线程运行,此时的效果为鼠标在窗口上点击一次,在点击的那个点沿y-i的方向持续填充圆形,并且只有在当前线程完成之后,下一个鼠标释放任务才会启动。那么为了能同时绘制多条填充圆形的路径,且他们之间互不干扰,就可以使用多线程。
现在我们创建一个线程类,并把启动线程的方法写在鼠标监听器下的鼠标松开方法中,这意味着,鼠标每松开一次,就会启动一个线程。
线程类
public class DrawThread extends Thread {
private Graphics g;
private int x,y;
public DrawThread(Graphics g,int x,int y) {
this.g = g;
this.x = x;
this.y = y;
}
public void run() {
for(int i = 0;i<50;i++) {
g.fillOval(x, y-i, 50, 50);
try {
Thread.sleep(300);
}catch(Exception ef) {
ef.printStackTrace();
}
}
}
}
在监听器类中的鼠标松开方法下创建线程类的对象并启动线程
public void mouseReleased(MouseEvent e) {
int x = e.getX();
int y = e.getY();
DrawThread dt = new DrawThread(g,x,y);
dt.start();
此时点击窗口上的画布,每释放一次鼠标,就会创建一个线程去执行线程类中的run方法,这样就能同时绘制多个沿一定方向填充的圆形。
内容总结
以上是互联网集市为您收集整理的java中的多线程全部内容,希望文章能够帮你解决java中的多线程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。