매개 변수를 사용하여 실행할 수 있습니까?
이러한 실행 가능이 실제로 존재하지 않는다는 것을 알고 있지만 "매개변수를 받아들이는 실행 가능"이 필요합니다.
이것은 앱 설계의 근본적인 결점이나 피곤한 두뇌의 장애일 수 있기 때문에, 저는 여기서 기본적인 OO의 원칙을 위반하지 않고 다음과 같은 일을 할 수 있는 방법에 대한 조언을 찾고 싶습니다.
private Runnable mOneShotTask = new Runnable(String str) {
public void run(String str) {
someFunc(str);
}
};
위와 같은 일을 어떻게 해낼지 아는가?
음, 제가 이것을 처음 게시한 지 거의 9년이 지났습니다.솔직히 그 이후로 Java는 몇 가지 개선점을 만들었습니다.제 원래 답변을 아래에 남깁니다만, 그 안에 있는 것을 사람들이 할 필요는 없습니다.9년 전 코드 리뷰에서, 저는 왜 그랬는지 의문을 제기하고, 아마 승인하지 않았을지도 모릅니다.현대의 람다를 이용할 수 있게 되면, 낡은 어프로치를 추천하는, 투표율이 높은 회답은 무책임합니다(공평하게 말하면, 우선은 의심스러운 것입니다).현대 자바에서는 코드 리뷰가 즉시 거부되어 다음과 같이 제안됩니다.
void foo(final String str) {
Thread t = new Thread(() -> someFunc(str));
t.start();
}
지금까지와 같이, 그 스레드를 의미 있게 다루는 등의 디테일은 독자에게 연습으로 남는다.단도직입적으로 말하면 람다 사용이 두렵다면 멀티 스레드 시스템을 더욱 두려워해야 합니다.
원래 답변은 다음과 같습니다.
메서드에서 클래스를 바로 선언할 수 있습니다.
void Foo(String str) {
class OneShotTask implements Runnable {
String str;
OneShotTask(String s) { str = s; }
public void run() {
someFunc(str);
}
}
Thread t = new Thread(new OneShotTask(str));
t.start();
}
함수에 넣을 수도 있어요
String paramStr = "a parameter";
Runnable myRunnable = createRunnable(paramStr);
private Runnable createRunnable(final String paramStr){
Runnable aRunnable = new Runnable(){
public void run(){
someFunc(paramStr);
}
};
return aRunnable;
}
(이것을 사용했을 때 파라미터는 정수 ID로 ID --> myRunnables의 해시맵을 작성하기 위해 사용되었습니다).이렇게 하면 해시맵을 사용하여 핸들러 내의 다양한 myRunnable 객체를 게시 또는 삭제할 수 있습니다.)
theView.post(new Runnable() {
String str;
@Override
public void run() {
par.Log(str);
}
public Runnable init(String pstr) {
this.str=pstr;
return(this);
}
}.init(str));
오브젝트 자체를 반환하고 파라미터를 초기화하는 init 함수를 만듭니다.
Java 8 이후, 가장 좋은 답은 다음과 같습니다.Consumer<T>
:
https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html
이것은 기능 인터페이스 중 하나입니다.즉, 람다 표현이라고 부를 수 있습니다.
void doSomething(Consumer<String> something) {
something.accept("hello!");
}
...
doSomething( (something) -> System.out.println(something) )
...
Runnable 인터페이스를 구현하는 다음 클래스를 사용합니다.이 클래스를 사용하면 인수가 있는 새 스레드를 쉽게 만들 수 있습니다.
public abstract class RunnableArg implements Runnable {
Object[] m_args;
public RunnableArg() {
}
public void run(Object... args) {
setArgs(args);
run();
}
public void setArgs(Object... args) {
m_args = args;
}
public int getArgCount() {
return m_args == null ? 0 : m_args.length;
}
public Object[] getArgs() {
return m_args;
}
}
두 가지 옵션이 있습니다.
이름 있는 클래스를 정의합니다.지정된 클래스의 생성자에게 매개 변수를 전달합니다.
익명 클래스가 "파라미터"를 닫도록 합니다. '마킹해주세요'라고해 주세요.
final
.
먼저 새로운 Runnable() 또는 run()에 전달할 인수가 필요하기 때문에 여기서 무엇을 달성하려고 하는지 알고 싶습니다.일반적인 방법은 시작하기 전에 멤버 변수를 설정하여 데이터(str)를 스레드에 전달하는 Runnable 개체를 갖는 것입니다.run() 메서드는 이러한 멤버 변수 값을 사용하여 some Func()를 실행합니다.
/**
* @author AbdelWadoud Rasmi
* <p>
* The goal of this class is to pass some parameters to a runnable instance, a good example is
* after caching a file you need to pass the new path to user to do some work on it.
*/
public abstract class ParameterizedRunnable implements Runnable {
private Object[] params;
/**
* @param params: parameters you want to pass the the runnable.
*/
public ParameterizedRunnable(Object... params) {
this.params = params;
}
/**
* Code you want to run
*
* @param params:parameters you want to pass the the runnable.
*/
protected abstract void run(Object... params);
@Override
public final void run() {
run(params);
}
/**
* setting params
*/
public void setParams(Object... params) {
this.params = params;
}
/**
* getting params
*/
public Object[] getParams() {
return params;
}
}
지금까지의 최선의 방법:
Consumer<String> oneShot = str -> {
somefunc(str);
};
oneShot.accept("myString");
언급URL : https://stackoverflow.com/questions/5853167/runnable-with-a-parameter
'programing' 카테고리의 다른 글
JSONObject를 반복하는 방법 (0) | 2022.07.01 |
---|---|
"std"에 "std"가 포함되지 않고 C에서 무엇을 할 수 있습니까?'C'의 일부일까요, 아니면 그냥 라이브러리일까요? (0) | 2022.07.01 |
Axios 매개 변수가 URL에 올바르게 추가되지 않음 (0) | 2022.07.01 |
SSR의 Vuex 모듈 재설정 상태 (0) | 2022.07.01 |
문자열이 C에서 다른 문자열로 시작되는지 확인하는 방법 (0) | 2022.07.01 |