多线程:
进程:在一个时间段内只能完成一件事情。
线程:在进程基础上划分,之后在同一个时间段内可以比传统进程完成的功能更多。
线程与进程的区别:
多个进程的内部数据和状态都是完全独立的,而多个线程是共享一块内存空间和一组系统资源,有可能相互影响
线程本身的数据通常只有寄存器数据,以及一个程序执行时实用的堆栈,所以线程的切换比进程切换的负担要小
如果要执行一个线程,则要调用:public void start()方法
start() -》 调用的是子类中 run() 方法
程序是交替运行的,不是像直接调用run()方法那样的顺序执行。
线程有两种实现方式:
第一种实现方式:
class MyThread extends Thread{
public void run(){
需要进行的代码,列如循环。
}
}
public class TestThread{
public static void main(){
MyThread t1 = new Mythread() ;//直接实例化
t1.start();//启动线程
}
只有等到所以的线程全部结束之后,进程才退出。
第二种实现方式:
Class MyThread implements Runnable{
public void run(){
}
public static void main(String args[]){
MyThread t = new MyThread() ;//实例化
Thread t1 = new Thread(t);//实例化Thread对象
t1.start();//启动线程
}
经过几个线程的练习,我渐渐有了领悟
public class Paint extends JPanel implements KeyListener,Runnable{ Diretion di = new Diretion() ;//实例化方向对象 boolean s =false ; private int begin ; Music ss = new Music("Images/1.mp3") ; Image bj = Toolkit.getDefaultToolkit().getImage("images/bj.jpg") ; Image tou = Toolkit.getDefaultToolkit().getImage("images/tou.jpg") ; Image eat = Toolkit.getDefaultToolkit().getImage("images/eat.jpg") ; Image ks = Toolkit.getDefaultToolkit().getImage("images/ks.jpg") ; Image shu = Toolkit.getDefaultToolkit().getImage("images/shu.jpg") ; Image jd = Toolkit.getDefaultToolkit().getImage("images/jd.jpg") ; public void paint(Graphics g){ super.paint(g); g.drawImage(bj, 0, 0, 635, 510, null) ;//背景 g.drawImage(tou,di.x[0],di.y[0],20,20,null) ;//添加蛇头 g.drawImage(eat,di.ex,di.ey,20,20,null) ; for(int i=1;i<di.sum-1;i++){ //填充蛇身 g.drawImage(jd,di.x[i], di.y[i], 20, 20, null) ; } g.drawString("当前分数: "+ di.score, 540, 450) ; g.drawString("玩家等级: "+ di.lv,10,450) ; g.setColor(Color.WHITE) ; if(di.begin == 0){ ss.stop(); if(s == true){ g.drawImage(shu, 0, 0,635, 510, null) ; g.setFont(new Font("黑体",1,20)) ; g.drawString("按ENTER重新开始游戏", 230, 220) ; }else{ g.drawImage(ks,0,0,635,510,null) ; } } } public void setBegin(Diretion begin){ this.begin = Diretion.begin ; } public void run() { //刷新面板的线程 Thread t3= new Thread(di); t3.start(); while(true){ try{Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();} this.repaint(); } } public void keyTyped(KeyEvent arg0) {} //不用 //定义方向,2向下,4向左,6向右,8向上;其余的无移动 public void keyPressed(KeyEvent e) {//监控键盘 if(di.begin == 1){ if(e.getKeyCode() == KeyEvent.VK_W || e.getKeyCode() == KeyEvent.VK_UP){//向上 if(di.dir != 2){di.dir = 8 ; } }else if(e.getKeyCode() == KeyEvent.VK_S || e.getKeyCode()== KeyEvent.VK_DOWN){//向下 if(di.dir != 8){di.dir = 2 ;} }else if(e.getKeyCode() == KeyEvent.VK_A || e.getKeyCode() == KeyEvent.VK_LEFT){//向左 if(di.dir != 6){di.dir = 4 ;} }else if(e.getKeyCode() == KeyEvent.VK_D || e.getKeyCode() == KeyEvent.VK_RIGHT) {//向右 if(di.dir != 4){di.dir = 6 ;} } }else{//当前游戏结束,按ENTER键重新开始有戏 if(e.getKeyCode() == KeyEvent.VK_ENTER){ ss.play(); di.sum =4; di.x[0] = 100 ; di.y[0] = 100 ; di.x[1] = 80 ; di.y[1] = 100 ; di.x[2] = 60 ; di.y[2] = 100 ; di.shuimian = 200 ; di.begin = 1 ; di.dir = 6 ; di.ndir = 6 ; di.sp = 20 ; s = true ; } } } public void keyReleased(KeyEvent arg0) {}//不用 } 线程的嵌套; 然后我在主函数里面在实例化paint,调用线程
线程的并行,解决闪现问题,我们可以用贴纸,贴上去
Thread t1 = new Thread(new Runnable() { public void run(){ ImageIcon img = new ImageIcon("Images/bj.jpg"); while(true){ try{ Thread.sleep(20); BufferedImage bufImage = new BufferedImage(jp.getWidth(),jp.getHeight(),BufferedImage.TYPE_INT_RGB); Graphics g = bufImage.getGraphics(); g.drawImage(img.getImage(), 0,0,null); for(int i=0;i<t.sf.size();i++){ ThreadDemo f = t.sf.get(i); f.Draw(g) ; } jp.getGraphics().drawImage(bufImage,0,0,null) ; }catch(Exception e){ e.printStackTrace(); } } } }); }
相关推荐
"大漠多线程模板"是一个专门针对C#开发的多线程处理框架,它为开发者提供了便捷的方式来管理和优化多线程应用。这个框架由知名开发者"大漠"创建,旨在简化复杂的并发编程,提高代码的可读性和可维护性。 多线程允许...
在IT行业中,多线程是一种常见的编程技术,它允许程序同时执行多个独立的任务,从而提高计算机系统的效率和响应性。特别是在自动化工具如“按键精灵”中,多线程的应用能够显著提升其性能和实用性。 标题“多线程_...
标题中的“pb9多线程控件”指的是在PowerBuilder 9.0(PB9)环境中,使用的一种能够实现真正多线程功能的组件或技术。PowerBuilder是一款经典的面向对象的开发工具,主要用于构建数据库应用系统。在PB的早期版本中,...
在编程领域,多线程是实现并发执行任务的重要机制,特别是在现代计算机系统中,多核处理器使得多线程成为提高程序性能的关键手段。C#语言提供了丰富的多线程支持,让我们能够编写出高效的多线程应用程序。在这个"多...
在IT领域,多线程编程是一项关键技能,尤其是在性能优化和并发处理方面。本文将深入探讨多线程编程的基础知识,以帮助初学者快速入门。 首先,我们需要理解什么是多线程。多线程是指在一个进程中同时执行多个独立的...
基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip...