java,线程Thread(Runnable target) ?

java,线程Thread(Runnable target) ?,第1张

你的理解很正确,只要是实现了Runnable接口的类都可以传进去。
这个参数可以是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增加到单选按钮组中

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10556970.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-09
下一篇 2023-05-09

发表评论

登录后才能评论

评论列表(0条)

保存