这个参数可以是API中已经有的,也可以是自己写的。
常用的创建线程的方法有两种,第一种就是继承Thread类,直接new
出来就可以,Thread类本身也实现了Runnable接口。
第二种方法就是实现Runnable接口里面的run方法。
语法正如你的代码一样
你现在写的线程是用匿名内部类的形式写的,这样是没法传对象进线程的,需要用显式声明的实现Runnable接口的类的构造函数来接收传进线程的对象
我给你个向线程里传对象的Java程序的例子,你看看吧
class BaoZi{int id;
BaoZi(int id){
thisid = id;
}
public String toString() {
return "BaoZi :" + id;
}
}
class BamBooBasket {
int index = 0;
BaoZi[] bbb = new BaoZi[6];
public synchronized void put(BaoZi b) {
if(index == bbblength) {
try{
thiswait();
} catch(InterruptedException e) {
eprintStackTrace();
}
}else{
thisnotify();
bbb[index] = b;
index ++;
}
}
public synchronized BaoZi pop() {
if(index == 0) {
try{
thiswait();
} catch (InterruptedException e) {
eprintStackTrace();
}
}else{
thisnotify();
index--;
}
return bbb[index];
}
}
class Producer implements Runnable {
BamBooBasket bb =null;
Producer(BamBooBasket bb) {
thisbb = bb;
}
public void run() {
for(int i=0;i<20;i++) {
BaoZi b = new BaoZi(i);
bbput(b);
Systemoutprintln("生产了:" + b);
try {
Threadsleep(1000);
} catch (InterruptedException e) {
eprintStackTrace();
}
}
}
}
class Consumer implements Runnable {
BamBooBasket bb = null;
Consumer(BamBooBasket bb) {
thisbb = bb;
}
public void run() {
for(int i=0;i<20;i++) {
BaoZi b = bbpop();
Systemoutprintln("消费了 :"+ b);
try {
Threadsleep(1000);
} catch (InterruptedException e) {
eprintStackTrace();
}
}
}
}
public class ProducerConsumer {
public static void main(String[] args) {
BamBooBasket bbb = new BamBooBasket();
Producer p1 = new Producer(bbb);
Consumer p2 = new Consumer(bbb);
Thread t1 = new Thread(p1);
Thread t2 = new Thread(p2);
t1start();
t2start();
}
}
java中Runnable接口:是一个接口,它里面只有一个run()方法,没有start()方法,继承Runnable并实现这个方法就可以实现多线程了,但是这个run()方法不能自己调用,必须由系统来调用。
举例如下:
[java] view plain copy
public interface Runnable{
public void run();
}
所以,即使实现了Runnable接口,那也无法启动线程,必须依托其他类。
而Thread类,有一个构造方法,参数是Runnable对象,也就是说可以通过Thread类来启动Runnable实现的多线程。
[java] view plain copy
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
所以,实现Runnable接口后,需要使用Thread类来启动。
单选按钮(JRadioButton)的功能与单选框相似。使用单选按钮的方法是将一些单选按钮用ButtonGroup对象分组,使同一组的单选按钮只允许有一个被选中。单选按钮与单选框的差异是显示的样式不同,单选按钮是一个圆形的按钮,单选框是一个小方框。
JRadioButton类的常用构造方法有以下几个:
1JRadioButton():用空标题构造单选按钮。
2JRadioButton(String s):用给定的标题s构造单选按钮。
3JRadioButton(String s,boolean b):用给定的标题s构造单选按钮,参数b设置选中与否的初始状态。
单选按钮使用时需要使用ButtonGroup将单选按钮分组,单选按钮的分组方法是先创建对象,然后将同组的单选按钮添加到同一个ButtonGroup对象中。参见例62程序的子类panel1的声明,组内有3个单选按钮。
java单选按钮传值的示例:
package comlw;
import javaawtEventQueue;
import javaawtFlowLayout;
import javaxswingButtonGroup;
import javaxswingJFrame;
import javaxswingJPanel;
import javaxswingJRadioButton;
import javaxswingUIManager;
import javaxswingborderEmptyBorder;
public class JRadioButtonDemo extends JFrame {
private static final long serialVersionUID = 8854703659153206227L;
private JPanel contentPane;
public static void main(String[] args) {
try {
UIManager
setLookAndFeel("comsunjavaswingplafnimbusNimbusLookAndFeel");
} catch (Throwable e) {
eprintStackTrace();
}
EventQueueinvokeLater(new Runnable() {
public void run() {
try {
JRadioButtonDemo frame = new JRadioButtonDemo();
framesetVisible(true);
} catch (Exception e) {
eprintStackTrace();
}
}
});
}
public JRadioButtonDemo() {
setTitle("单选按钮使用");// 设置窗体的标题
setDefaultCloseOperation(JFrameEXIT_ON_CLOSE);// 设置窗体退出时 *** 作
setBounds(100, 100, 250, 100);// 设置窗体位置和大小
contentPane = new JPanel();// 创建内容面板
contentPanesetBorder(new EmptyBorder(5, 5, 5, 5));// 设置面板的边框
setContentPane(contentPane);// 应用内容面板
contentPanesetLayout(new FlowLayout(FlowLayoutCENTER, 5, 5));// 设置内容面板为流式布局
JRadioButton radioButton1 = new JRadioButton("Java");// 创建单选按钮
contentPaneadd(radioButton1);// 应用单选按钮
JRadioButton radioButton2 = new JRadioButton("PHP");// 创建单选按钮
contentPaneadd(radioButton2);// 应用单选按钮
JRadioButton radioButton3 = new JRadioButton("C++");// 创建单选按钮
contentPaneadd(radioButton3);// 应用单选按钮
ButtonGroup group = new ButtonGroup();// 创建单选按钮组
groupadd(radioButton1);// 将radioButton1增加到单选按钮组中
groupadd(radioButton2);// 将radioButton2增加到单选按钮组中
groupadd(radioButton3);// 将radioButton3增加到单选按钮组中
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)