关于并发编程概念进程线程1.进程 操作系统分配资源的最小单位example电脑上每打开一个软件就是一个进程微信、浏览器等特点进程之间内存完全隔离互不通用每个进程拥有独立CPU、内存、文件等全套资源2.线程线程隶属于进程是CPU调度执行的最小单位一个进程里可以包含多条线程example网易云音乐进程内有多个线程线程A播放歌曲线程B滚动歌词线程C加载网络歌单特点一个进程内所有线程共享当前进程的全部内存、资源实现线程的三种方式1.继承Thread类自定义类继承Thread类重写 run() 方法写线程任务创建子类对象调用 start() 启动线程classMyThreadextendsThread{Overridepublicvoidrun(){System.out.println(线程执行);}}//应用如下MyThreadtnewMyThread();t.start();注必须重写run方法启动线程后自动执行run方法执行完该线程资源被释放不能再次启动缺点Java单继承继承Thread后不能再继承其他类。2.实现Runnable接口自定义类接口Runnable实现 run() 方法将Runnable实例传入Thread构造调用 start()classMyRunimplementsRunnable{Overridepublicvoidrun(){System.out.println(线程任务);}}// 应用ThreadtnewThread(newMyRun());t.start();优点只实现接口不占用继承名额多个线程可共用同一个Runnable对象并共享数据。3.实现Callable接口 FutureTask类实现 Callable重写 call()有返回值包装到 FutureTask再传入 Thread 启动通过 get() 获取线程返回结果importjava.util.concurrent.Callable;importjava.util.concurrent.FutureTask;classMyCallimplementsCallableInteger{OverridepublicIntegercall()throwsException{intsum0;for(inti1;i10;i)sumi;returnsum;}}// 应用FutureTaskIntegertasknewFutureTask(newMyCall());ThreadtnewThread(task);t.start();// 获取返回值Integerrestask.get();System.out.println(res);并发并行并发和并行是CPU执行的两种模式1.并发同一时间CPU只执行1件事轮流切换多个线程2.并行同一时间多个CPU核心同时执行多条线程并行一定是并发但并发不一定是并行关于焦点焦点是当前被系统选中、正在接受键盘输入的窗口、组件。同一时刻只能有一个组件拥有键盘焦点example微信输入框打字时光标闪烁输入框获取焦点键盘文字进入输入框鼠标点击桌面空白处时输入框失去焦点再按键盘文字不会输入微信中在Java中只有组件JFrame窗口、JPanel面板、按钮等获取焦点键盘按键才能被监听器监听为什么要实时获取焦点程序启动时执行一次 requestFocus窗口有焦点当鼠标点击IDEA 控制台后焦点跑到 IDEA游戏窗口失焦此时按键盘完全没反应如果代码里没有任何地方再次调用 requestFocus将永远无法获取焦点焦点实时调用的方法在频繁触发的事件里反复执行获取焦点的代码确保焦点能随时回到游戏窗口example摘自Java学习进程11中GameUI类//不要直接在JFrame窗口绘图窗口自带边框、标题栏坐标偏移形成误差// 新建容器JPanel面板作为画布JPanelgamePanelnewJPanel();gamePanel.setBackground(Color.WHITE);jf.add(gamePanel,BorderLayout.CENTER);jf.setVisible(true);//让画笔、监听器绑定面板Graphicsgjf.getGraphics();GameListenerlistenernewGameListener(g);gamePanel.addMouseListener(listener);gamePanel.addKeyListener(listener);//让gamePanel面板对象得到焦点//允许面板获取焦点gamePanel.setFocusable(true);//在程序运行时让面板获取键盘焦点gamePanel.requestFocus();只有键盘监听器KeyListener必须依赖焦点keyTyped keyPressedkeyTyped只能监听录入数据的按键字母、数字keyPressed只要按下按键就能监听到MouseListener MouseAdapterMouseListener中规定了5个必须实现的鼠标方法mouseClicked 点击mousePressed 鼠标按下mouseReleased 鼠标松开mouseEntered 鼠标进到窗口mouseExited 鼠标离开窗口若实现MouseListener接口必须把5个方法全部写完MouseAdapter专门用来监听鼠标所有动作点击、按下、松开、移动、拖拽、滚轮滑动若继承MouseAdapter已经提前空实现了这5个方法重写自己需要的方法即可关于foreach遍历foreach遍历格式for(单个元素类型 临时变量 要遍历的集合/数组{}等价普通for循环for(inti0;i集合.size();i){元素类型 临时变量集合.get(i);使用临时变量}example代码中实现获取方块坐标的部分foreach格式for(Pointp:blocklist){g.fillRect(p.x,p.y,30,30);}等价for循环for(inti0;iblocklist.size();i){Pointpblocklist.get(i);g.fillRect(p.x,p.y,30,30);}
阅读完成 · 觉得有帮助?