java多線程編程實(shí)現(xiàn)下雪效果
沒(méi)有直接采用繼承Thread類(lèi)或者繼承Runnable的接口來(lái)實(shí)現(xiàn)多線程,而是使用了匿名內(nèi)部類(lèi)。
要導(dǎo)入的類(lèi):
import javax.swing.*; import java.awt.*;
1.定義SowPanel類(lèi),繼承JPanel類(lèi),這個(gè)類(lèi)有兩個(gè)整型數(shù)組成員,用來(lái)保存雪花起始位置。在構(gòu)造函數(shù)中為數(shù)組賦初值;重寫(xiě)父類(lèi)的paint()方法;定義一個(gè)啟動(dòng)多線程的startSnow()方法。
class SnowPanel extends JPanel { //定義整型數(shù)組,存儲(chǔ)雪花坐標(biāo) private int[] x=new int[300]; private int[] y=new int[300]; public SnowPanel() { //設(shè)置背景為黑色 setBackground(Color.black); //用隨機(jī)數(shù)初始化雪花坐標(biāo) for(int i=0;i<x.length;i++) { x[i]=(int)(Math.random()*800); y[i]=(int)(Math.random()*600); } } public void paint(Graphics g) { //繼承父類(lèi)畫(huà)的方法 super.paint(g); //設(shè)置顏色為白色 g.setColor(Color.white); //利用循環(huán)畫(huà)出多個(gè)雪花 for(int i=0;i<x.length;i++) { g.drawString("*",x[i],y[i]); } } //定義一個(gè)方法啟動(dòng)多線程,并使用匿名內(nèi)部類(lèi) public void startSnow() { new Thread() { public void run() { while(true) { for(int i=0;i<y.length;i++) { //坐標(biāo)下移 y[i]++; //檢查是否越界 if(y[i]==600) y[i]=0; //重繪 repaint(); } try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } }
2.定義ShowFrame類(lèi),繼承Jframe 類(lèi)。在構(gòu)造方法中設(shè)置窗口的顯示屬性,并創(chuàng)建ShowPanel對(duì)象,添加到窗口中。
class SnowPanel extends JPanel { //定義整型數(shù)組,存儲(chǔ)雪花坐標(biāo) private int[] x=new int[300]; private int[] y=new int[300]; public SnowPanel() { //設(shè)置背景為黑色 setBackground(Color.black); //用隨機(jī)數(shù)初始化雪花坐標(biāo) for(int i=0;i<x.length;i++) { x[i]=(int)(Math.random()*800); y[i]=(int)(Math.random()*600); } } public void paint(Graphics g) { //繼承父類(lèi)畫(huà)的方法 super.paint(g); //設(shè)置顏色為白色 g.setColor(Color.white); //利用循環(huán)畫(huà)出多個(gè)雪花 for(int i=0;i<x.length;i++) { g.drawString("*",x[i],y[i]); } } //定義一個(gè)方法啟動(dòng)多線程,并使用匿名內(nèi)部類(lèi) public void startSnow() { new Thread() { public void run() { while(true) { for(int i=0;i<y.length;i++) { //坐標(biāo)下移 y[i]++; //檢查是否越界 if(y[i]==600) y[i]=0; //重繪 repaint(); } try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } }
3.運(yùn)行效果圖片(此為靜態(tài)圖):
疑問(wèn):發(fā)現(xiàn)其他的不改變,繼承Frame、Panel和繼承JFrame、Jpanel的運(yùn)行效果是不同的,前者顯示的下雪場(chǎng)景總是有閃爍的感覺(jué);后者則沒(méi)有閃爍,個(gè)人感覺(jué)后者效果更好些。
接下來(lái)我們來(lái)看個(gè)例子
這里我們做一個(gè)完整的例子來(lái)說(shuō)明線程產(chǎn)生的方式不同而生成的線程的區(qū)別:
package debug; import java.io.*; import java.lang.Thread; class MyThread extends Thread{ public int x = 0; public void run(){ System.out.println(++x); } } class R implements Runnable{ private int x = 0; public void run(){ System.out.println(++x); } } public class Test { public static void main(String[] args) throws Exception{ for(int i=0;i<10;i++){ Thread t = new MyThread(); t.start(); } Thread.sleep(10000);//讓上面的線程運(yùn)行完成 R r = new R(); for(int i=0;i<10;i++){ Thread t = new Thread(r); t.start(); } } }
上面10個(gè)線程對(duì)象產(chǎn)生的10個(gè)線程運(yùn)行時(shí)打印了10次1。下面10個(gè)線程對(duì)象產(chǎn)生的10個(gè)線程運(yùn)行時(shí)打印了1到10。我們把下面的10個(gè)線程稱(chēng)為同一實(shí)例(Runnable實(shí)例)的多個(gè)線程。
相關(guān)文章
Java中的線程池ThreadPoolExecutor深入解析
這篇文章主要介紹了Java中的線程池ThreadPoolExecutor深入解析,線程池,thread pool,是一種線程使用模式,線程池維護(hù)著多個(gè)線程,等待著監(jiān)督管理者分配可并發(fā)執(zhí)行的任務(wù),需要的朋友可以參考下2023-11-11Android開(kāi)發(fā)在輪播圖片上加入點(diǎn)擊事件的方法
這篇文章主要介紹了Android開(kāi)發(fā)在輪播圖片上加入點(diǎn)擊事件的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11詳解idea maven項(xiàng)目如何使用lib下得jar包
這篇文章主要介紹了詳解idea maven項(xiàng)目如何使用lib下得jar包,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12mybatis自動(dòng)填充時(shí)間字段示例代碼
這篇文章主要給大家介紹了關(guān)于mybatis自動(dòng)填充時(shí)間字段的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01利用Java實(shí)現(xiàn)mTLS調(diào)用
這篇文章主要介紹使用 Java作為客戶(hù)端 與受 mTLS 保護(hù)的服務(wù)交互。為了對(duì)我們的 Java 客戶(hù)端進(jìn)行 ssl 配置,我們需要先設(shè)置一個(gè) SSLContext。這簡(jiǎn)化了事情,因?yàn)?SSLContext 可用于各種 http 客戶(hù)端,接下來(lái)我們一起進(jìn)入下面文章了解具體內(nèi)容,需要的朋友可以參考一下2021-11-11詳解elasticsearch實(shí)現(xiàn)基于拼音搜索
這篇文章主要為大家介紹了詳解elasticsearch實(shí)現(xiàn)基于拼音搜索示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Spring Boot項(xiàng)目如何同時(shí)支持HTTP和HTTPS協(xié)議的實(shí)現(xiàn)
這篇文章主要介紹了Spring Boot項(xiàng)目如何同時(shí)支持HTTP和HTTPS協(xié)議的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10MyBatis-Plus集成Druid環(huán)境搭建的詳細(xì)教程
這篇文章主要介紹了MyBatis-Plus集成Druid環(huán)境搭建的詳細(xì)教程,需要的朋友可以參考下2020-08-08