学了多线程---日常2022年6月14日
这两天学了多线程的更深层次的运用,比如Timer类,虽然还是不太熟悉,不过这是一种可以计时使用的进程类,后来的作业有布置做两个线程,这时候就要用到synchronized,这是一个线程锁,确保两个线程不会同时运行,好像还有一个lock的方法,下次看看,今天太晚了就不看了,调用access数据表里的行数据可以用absolute()方法,上次给组件画轨迹,不断创建Jlabel类,再放进去,轨迹不会消失,成功了,结果如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | package 实验 15 ; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import java.awt.Graphics; import java.awt.Point; public class Third { public static void main(String[] args) { // TODO 自动生成的方法存根 win a= new win(); } } class win extends Thread{ JFrame jf; JLabel jl1,jl2; JLabel j1; static String str1,str2; Thread move; int speed= 10 ; int x1= 40 ,x2= 300 ,y1= 30 ,y2= 10 ,count= 0 ; int r= 60 ; win(){ move= new Thread( this ); jf= new JFrame( "标签移动" ); jf.setSize( 600 , 400 ); jf.setLayout( null ); init(); jf.setVisible( true ); jf.setLocationRelativeTo( null ); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //界面基本设置 } void init() { str1= "方形" ;str2= "圆形" ; jl1= new JLabel(str1);jl1.setForeground(Color.RED); jl2= new JLabel(str2);jl2.setForeground(Color.BLUE); //标签颜色设置 jl1.setBounds(x1, y1, 250 , 40 ); jl2.setBounds(x2,y2, 250 , 40 ); move.start(); //进程开始运行 jf.add(jl2);jf.add(jl1); } public void run() { x2+= 100 ;y2+= 100 ; //设定圆心 while ( true ) { System.out.println( "运行中" ); System.out.println(count); //运行过程正常检测程序 count++; jl2.setBounds(( int )(x2+(r*Math.cos(count))),( int )(y2+(r*Math.sin(count))), 250 , 40 ); //标签运动 JLabel j2= new JLabel( "." ); j2.setBounds(( int )(x2+(r*Math.cos(count))),( int )(y2+(r*Math.sin(count))), 250 , 40 ); //标签的运动轨迹 jf.add(j2); if (count< 30 ) { y1+= 5 ; jl1.setBounds(x1,y1, 250 , 40 ); //标签运动 JLabel jl= new JLabel( "." ); jl.setBounds(x1, y1, 250 , 40 ); //标签运动轨迹 jf.add(jl); } if (count>= 30 &&count< 60 ) { x1+= 5 ; jl1.setBounds(x1,y1, 250 , 40 ); //标签运动 JLabel jl= new JLabel( "." ); jl.setBounds(x1, y1, 250 , 40 ); //标签运动轨迹 jf.add(jl); } if (count>= 60 &&count< 90 ) { y1-= 5 ; jl1.setBounds(x1,y1, 250 , 40 ); //标签运动 JLabel jl= new JLabel( "." ); jl.setBounds(x1, y1, 250 , 40 ); //标签运动轨迹 jf.add(jl); } if (count>= 90 &&count< 120 ) { x1-= 5 ; jl1.setBounds(x1,y1, 250 , 40 ); //标签运动 JLabel jl= new JLabel( "." ); jl.setBounds(x1, y1, 250 , 40 ); //标签运动轨迹 jf.add(jl); } if (count>= 120 ) { count= 0 ; x1= 40 ;y1= 30 ; //标签回到原点 } try { Thread.sleep( 100 ); } catch (InterruptedException e) { e.printStackTrace(); } } } } |
线程总是一起开始,好麻烦,只能让一个先睡几秒了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构