java多线程机制:
例子 1
public class Example1
{
static Lefthand left;static Righthand right;
public static void main(String args[])
{
left=new Lefthand(); //创建两个线程。
right=new Righthand();
left.start();
right.start();
}
}
class Lefthand extends Thread
{
public void run()
{
for(int I=0;I<=5;I++)
{
System.out.println("I am a student");
try{sleep(500);}
catch(InterruptedException e){}
}
}
}
class Righthand extends Thread
{
public void run()
{
for(int I=0;I<=5;I++)
{
System.out.println("I am oookkk");
try{sleep(300);}
catch(InterruptedException e){}
}
}
}
在上述例子中,我们在main主线程中创建了两个新的线程lefthand和righthand。
当lefthand调用start()开始运行时,类Lefthand中的run()将自动被执行。
我们来分析一下上面程序的输出结果。
Left线程首先开始执行,这时Lefthand类中的run方法开始执行,输出”I am a student”后,left主动“休息”500毫秒,让出了CPU。
这时正在排队等待CPU的right线程的run方法马上被执行,输出“I am ookk”,right在主动让出CPU300毫秒后又来排队等待CPU服务,这时right发现left还没有“醒来”,即没有来排队抢占CPU,因此left的run方法被执行,又输出“I am oookkk“… …。
程序的执行结果是:
E:dd>java Example1
I am student
I am oookkk
I am oookkk
I am student
I am oookkk
I am oookkk
I am student
I am oookkk
I am student
I am oookkk
I am student
I am student
2.实现Runnable接口
例子 2
import java.applet.*;
import java.awt.*;
public class Example2 extends java.applet.Applet implements Runnable
{
Thread circleThread;
public void start()
{
if (circleThread==null)
{
circleThread=new Thread(this);
circleThread.start();
}
}
public void run()
{
while(circleThread !=null)
{
repaint();
try{
circleThread.sleep(1000);
}
catch(InterruptedException e){}
}
}
public void paint(Graphics g)
{
double i=Math.random();
if(i<0.5)
g.setColor(Color.red);
else
g.setColor(Color.blue);
g.fillOval(100,100,(int)(100*i),(int)(100*i));
}
public void ()
{
circleThread.yield();
circleThread=null;
}
}
在上述例子2中,我们在小程序这个主线程中用构造方法Thread(this)创建了一个新的线程。
This代表着小程序作为这个新的线程的目标对象,因此我们的小程序必须为这个新创建的线程实现Runnable接口,即小程序利用Runnable接口为其中创建的这个新线程提供run()方法,给出该线程的操作。
首先,在小程序的start()方法中构造了一个名为circleThread的线程并调用线程类的start()方法来启动这一线程,即在小程序的主线程中又开始了一个线程:circleThread。
下面的语句建立了一个新的线程:
circlethread =new Thread(this);
其中this作为该线程的目标对象,它必须实现Runnable接口。
线程被启动以后,自动调用目标对象的run()方法,除非线程被停止。
在run()方法的第十一中,Applet重绘本身,然后睡眠1秒,同时要捕获异常事件并进行处理。
如果你离开这一页,程序将调用()方法,将线程置空。
当你返回时,又会创建一个新的线程。
在具体应用中,采用哪种方法来构造线程体要视具体情况而定。
通常,当一个新的线程已继承了另一个类,而想在该线程中创建一个新的线程时,就应该用第二种方法来构造,即实现Rennable接口。
需要理解的是,我们的小应用程序实际上是浏览器的一个线程,这个线程由浏览器启动执行,浏览器自动调用执行小程中的init()、start()方法等。
因此我们要创建一个新的线程最好把新线程的启动放在小程序的start()方法中。
下面的例子3是一个应用程序,这个应用程序在创建窗口的同时又创建了一个新的线程,该线程负责让窗口中的一个按钮改变它的大小。
例子 3
import java.awt.*;
import java.awt.event.*;
public class Example3
{
public static void main(String args[])
{
Mywin win=new Mywin(); win.pack();
}
}
class Mywin extends Frame implements Runnable
{
Button b=new Button("ok");
int x=5;
Thread bird=null;
Mywin()
{
setBounds(100,100,120,120);
setLayout(new FlowLayout());
setVisible(true);
add(b);
b.setBackground(Color.green);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{System.exit(0);}
});
bird=new Thread(this); //创建一个新的线程,窗口做目标对象,
//替线程bird实现接口Runnable。
bird.start(); //在创建窗口时又开始了线程dird.
}
public void run()
{
while(true)
{
x=x+1;
if(x>100) x=5;
b.setBounds(40,40,x,x);
try{bird.sleep(200);}
catch(InterruptedException e){}
}
}
}
滚动字幕线程。
例子 4
import java.applet.*;
import java.awt.*;
public class Example4 extends java.applet.Applet implements Runnable
{
int x=0; Thread Scrollwords=null;
public void init()
{
setBackground(Color.cyan);
setForeground(Color.red);
setFont(new Font("TimesRoman",Font.BOLD,18));
}
public void start()
{
if(Scrollwords==null)
{
Scrollwords=new Thread(this);
Scrollwords.start();
}
}
public void run()
{
while (Scrollwords!=null)
{
x=x+5;
if(x>500)
x=0;
repaint();
try{Scrollwords.sleep(80);}
catch(InterruptedException e){}
}
}
public void paint(Graphics g)
{
g.drawString("欢 迎 使 用 字 典 ",x ,80);
}
public void ()
{
Scrollwords.yield();
Scrollwords=null;
}
}
带滚动字幕的小字典。
例子 5
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Example5 extends Applet implements ActionListener,Runnable
{
TextField text1,text2;
int x=0;
Thread Scrollwords=null;
public void init()
{
setBackground(Color.cyan);
setForeground(Color.red);
setFont(new Font("TimesRoman",Font.BOLD,18));
text1=new TextField(10);
text2=new TextField(10);
add(new Label("输入一个英文单词:"));
add(text1);
add(new Label("汉语意思:"));
add(text2);
text1.addActionListener(this);
}
public void start()
{
if(Scrollwords==null)
{
Scrollwords=new Thread(this);
Scrollwords.start();
}
}
public void run()
{
while (Scrollwords!=null)
{
x=x+5;
if(x>500)
x=0;
repaint();
try{Scrollwords.sleep(80);}
catch(InterruptedException e){}
}
}
public void paint(Graphics g)
{
g.drawString("欢 迎 使 用 字 典 ",x ,120);
}
public void ()
{
Scrollwords.yield();
Scrollwords=null;
}
public void actionPerformed(ActionEvent e)
{
if((e.getSource()==text1)&&(text1.getText().equals("boy")))
{
text2.setText("男孩");
}
else if((e.getSource()==text1)&&(text1.getText().equals("sun")))
{
text2.setText("太阳");
}
else
{
text2.setText("没有该单词");
}
}
}
下面是一个左手画圆右手画方的例子。
我们在主线程中创建了两个线程:left、right,其中一个负责画圆,另一个负责画方。
在这个例子中我们使用了容器类的方法getGraphics()来获取一个Graphics对象(可以理解为一个画笔)。
例子 6 (效果如图1所示)
图1 双线程绘画程序
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Example6 extends Applet implements Runnable
{
Thread left,right; Graphics mypen; int x,y;
public void init()
{
left=new Thread(this);
right=new Thread(this);
x=10; y=10;
mypen=getGraphics();
}
public void start()
{
left.start();
right.start();
}
public void run()
{
while(true)
if (Thread.currentThread()==left)
{
x=x+1;
if(x>240) x=10;
mypen.setColor(Color.blue);
mypen.clearRect(10,10,300,100);
mypen.drawRect(10+x,10,50,50);
try{left.sleep(60);}
catch(InterruptedException e){}
}
else if(Thread.currentThread()==right)
{
y=y+1;
if(y>240) y=10;
mypen.setColor(Color.red);
mypen.clearRect(10,110,300,100);
mypen.drawOval(10+y,110,50,50);
try{right.sleep(60);}
catch(InterruptedException e){}
}
}
public void ()
{
left=null;
right=null;
}
}
易探云怎么样?易探云(yitanyun.com)是一家知名云计算品牌,2017年成立,从业4年之久,目前主要从事出售香港VPS、香港独立服务器、香港站群服务器等,在售VPS线路有三网CN2、CN2 GIA,该公司旗下产品均采用KVM虚拟化架构。目前,易探云推出免备案香港物理机服务器性价比很高,E3-1230 8 核*1/16G DDR3/SATA 1TB/香港BGP线路/20Mbps/不限流量,仅...
ReadyDedis是一家2018年成立的国外VPS商家,由印度人开设,主要提供VPS和独立服务器租用等,可选数据中心包括美国洛杉矶、西雅图、亚特兰大、纽约、拉斯维加斯、杰克逊维尔、印度和德国等。目前,商家针对全部VPS主机提供新年5折优惠码,优惠后最低套餐1GB内存每月仅需2美元起,所有VPS均为1Gbps端口不限流量方式。下面列出几款主机配置信息。CPU:1core内存:1GB硬盘:25GB ...
极光KVM创立于2018年,主要经营美国洛杉矶CN2机房、CeRaNetworks机房、中国香港CeraNetworks机房、香港CMI机房等产品。其中,洛杉矶提供CN2 GIA、CN2 GT以及常规BGP直连线路接入。从名字也可以看到,VPS产品全部是基于KVM架构的。极光KVM也有明确的更换IP政策,下单时选择“IP保险计划”多支付10块钱,可以在服务周期内免费更换一次IP,当然也可以不选择,...